В случаях, когда требуется внедрение зависимостей, например, когда хранилище должно быть инициализировано реквизитами компонента, рекомендуется использовать ванильное хранилище с React.context.
// Consumer componentimport{useContext}from'react';import{useStore}from'zustand';functionBasicConsumer(){conststore=useContext(BearContext);if(!store)thrownewError('Missing BearContext.Provider in the tree');constbears=useStore(store,(s)=>s.bears);constaddBear=useStore(store,(s)=>s.addBear);return(<><div>{bears}Bears.</div><buttononClick={addBear}>Addbear</button></>);}
Извлечение контекстной логики в пользовательский хук¶
1 2 3 4 5 6 7 8 91011121314
// Mimic the hook returned by `create`import{useContext}from'react';import{useStore}from'zustand';functionuseBearContext<T>(selector:(state:BearState)=>T):T{conststore=useContext(BearContext);if(!store)thrownewError('Missing BearContext.Provider in the tree');returnuseStore(store,selector);}
1 2 3 4 5 6 7 8 91011
// Consumer usage of the custom hookfunctionCommonConsumer(){constbears=useBearContext((s)=>s.bears);constaddBear=useBearContext((s)=>s.addBear);return(<><div>{bears}Bears.</div><buttononClick={addBear}>Addbear</button></>);}
По желанию можно использовать пользовательскую функцию равенства¶
1 2 3 4 5 6 7 8 910111213141516171819
// Allow custom equality function by using useStoreWithEqualityFn instead of useStoreimport{useContext}from'react';import{useStoreWithEqualityFn}from'zustand/traditional';functionuseBearContext<T>(selector:(state:BearState)=>T,equalityFn?:(left:T,right:T)=>boolean):T{conststore=useContext(BearContext);if(!store)thrownewError('Missing BearContext.Provider in the tree');returnuseStoreWithEqualityFn(store,selector,equalityFn);}