В случаях, когда требуется внедрение зависимостей, например, когда хранилище должно быть инициализировано реквизитами компонента, рекомендуется использовать ванильное хранилище с React.context.
// Provider wrapper
import { useRef } from 'react';
type BearProviderProps = React.PropsWithChildren<BearProps>;
function BearProvider({
children,
...props
}: BearProviderProps) {
const storeRef = useRef<BearStore>();
if (!storeRef.current) {
storeRef.current = createBearStore(props);
}
return (
<BearContext.Provider value={storeRef.current}>
{children}
</BearContext.Provider>
);
}
Извлечение контекстной логики в пользовательский хук¶
1 2 3 4 5 6 7 8 91011121314
// Mimic the hook returned by `create`
import { useContext } from 'react';
import { useStore } from 'zustand';
function useBearContext<T>(
selector: (state: BearState) => T
): T {
const store = useContext(BearContext);
if (!store)
throw new Error(
'Missing BearContext.Provider in the tree'
);
return useStore(store, selector);
}
По желанию можно использовать пользовательскую функцию равенства¶
1 2 3 4 5 6 7 8 910111213141516171819
// Allow custom equality function by using useStoreWithEqualityFn instead of useStore
import { useContext } from 'react';
import { useStoreWithEqualityFn } from 'zustand/traditional';
function useBearContext<T>(
selector: (state: BearState) => T,
equalityFn?: (left: T, right: T) => boolean
): T {
const store = useContext(BearContext);
if (!store)
throw new Error(
'Missing BearContext.Provider in the tree'
);
return useStoreWithEqualityFn(
store,
selector,
equalityFn
);
}