本文档介绍了如何将 Zustand 与 React 的 Context API 集成,以实现依赖注入和通过 props 初始化 store。在 Zustand 中使用 React Context 允许您创建作用域的 store 实例,并在组件树中共享它们,而无需 prop drilling。
Zustand v3 之前提供了一个专用的 createContext 工具,该工具在 v4 中已被弃用。本文档重点介绍使用 React 的原生 Context API 和 Zustand store 的当前推荐方法。
将 Zustand 与 React Context 集成提供了多项优势:
当前推荐的方法是使用 React 内置的 Context API 来向组件提供 Zustand store。
来源:docs/previous-versions/zustand-v3-create-context.md109-140
来源:docs/previous-versions/zustand-v3-create-context.md109-140
来源:docs/previous-versions/zustand-v3-create-context.md109-140
一种常见的模式是使用传递给 Provider 的 props 来初始化 store。
来源:docs/previous-versions/zustand-v3-create-context.md83-105
在 Zustand v3 中,提供了一个专门的 createContext 工具,该工具在 v4 中已被弃用。
来源:docs/previous-versions/zustand-v3-create-context.md11-29 docs/previous-versions/zustand-v3-create-context.md33-80
要从 v3 的 createContext 方法迁移到 v4 的原生 React Context 方法,请执行以下操作:
| v3 方法 | v4 方法 |
|---|---|
import createContext from 'zustand/context' | import { createContext } from 'react' |
const { Provider, useStore } = createContext() | 创建您自己的 StoreContext、StoreProvider 和自定义 hook。 |
<Provider createStore={createStore}> | <StoreContext.Provider value={storeRef.current}> |
useStore(selector) | 使用 useContext 和 useStore 的自定义 hook。 |
对于 TypeScript 用户,请将
createContext<T>() 替换为 createContext<StoreApi<T>>()createContext<T, S>() 替换为 createContext<S>()来源:docs/previous-versions/zustand-v3-create-context.md107-140 docs/migrations/migrating-to-v4.md227-250
或者,您可以使用提供 v4 兼容 v3 API 的第三方库。
zustand-dizustand-utils来源:docs/previous-versions/zustand-v3-create-context.md142-146
对于复杂的应用程序,为不同的域创建单独的 Context。
来源:docs/previous-versions/zustand-v3-create-context.md109-140
Provider 位置:将 Provider 放置在组件树的尽可能低的位置,以限制重渲染。
Memoize 选择器:对昂贵的计算使用 memoized 选择器。
基于 Context 的集成使注入 mock store 进行测试变得容易。
来源:docs/previous-versions/zustand-v3-create-context.md109-140
当使用 TypeScript 和 Context 集成模式时