Provider 与状态隔离
为组件作用域的 store 创建上下文 Provider
为什么使用 Provider?
Provider 可以用来创建组件隔离的 store 实例,非常适合独立状态的组件。
比如弹窗、Tabs 或任何多次出现的组件。
创建 Provider
你可以使用 createProvider
创建 Provider。
它返回一个 Provider 组件、一个获取 store 实例的 hook 和获取当前 store 的操作方法。
const [Provider, useFindStore, storeActions] = createProvider(initialState);
举个例子:
const [CounterStoreProvider, useFindCounterStore, storeActions] =
createProvider({
count: 0,
increment() {
// 使用 `getState` 获取当前状态
const state = storeActions.getState();
// 使用 `setState` 设置新状态
storeActions.setState({
...state,
count: state.count + 1,
});
},
});
注意:
storeActions
只能在初始状态里的方法中访问,不要导出给外部使用- 你可以使用
useFindStore
从 Provider 获取 store 实例 - 这与 Vue 的
provide
/inject
模式非常相似
初始化 Provider
你可以向不同的 Provider 传递不同的初始值(可选),它们彼此隔离。
function App() {
return (
<Tabs>
<CounterStoreProvider initialState={{ count: 100 }}>
<Counter />
</CounterStoreProvider>
<CounterStoreProvider initialState={{ count: 200 }}>
<Counter />
</CounterStoreProvider>
</Tabs>
);
}
使用 Provider 中的 Store 实例
function Counter() {
// 首先,从 Provider 获取 store 实例
const counterStore = useFindCounterStore();
// 然后,像普通 store 一样使用即可
const { count } = useStoreValue(counterStore);
return (
<>
<p>计数: {count}</p>
<button onClick={counterStore.value.increment}>增加</button>
</>
);
}