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>
    </>
  );
}