• 简体中文
  • 来自 zustand/context 的 createContext

    从 v3.5 开始提供了一个特殊的 createContext, 用于避免误用 store Hook。

    注意:该函数在 v4 中已废弃,并将在 v5 中移除。参见迁移。

    import create from 'zustand'
    import createContext from 'zustand/context'
    
    const { Provider, useStore } = createContext()
    
    const createStore = () => create(...)
    
    const App = () => (
      <Provider createStore={createStore}>
        ...
      </Provider>
    )
    
    const Component = () => {
      const state = useStore()
      const slice = useStore(selector)
      ...

    在真实组件中使用 createContext

    import create from "zustand";
    import createContext from "zustand/context";
    
    // Best practice: You can move the below createContext() and createStore to a separate file(store.js) and import the Provider, useStore here/wherever you need.
    
    const { Provider, useStore } = createContext();
    
    const createStore = () =>
      create((set) => ({
        bears: 0,
        increasePopulation: () => set((state) => ({ bears: state.bears + 1 })),
        removeAllBears: () => set({ bears: 0 })
      }));
    
    const Button = () => {
      return (
          {/** store() - This will create a store for each time using the Button component instead of using one store for all components **/}
        <Provider createStore={createStore}>
          <ButtonChild />
        </Provider>
      );
    };
    
    const ButtonChild = () => {
      const state = useStore();
      return (
        <div>
          {state.bears}
          <button
            onClick={() => {
              state.increasePopulation();
            }}
          >
            +
          </button>
        </div>
      );
    };
    
    export default function App() {
      return (
        <div className="App">
          <Button />
          <Button />
        </div>
      );
    }

    从 props 初始化时使用 createContext

    import create from 'zustand'
    import createContext from 'zustand/context'
    
    const { Provider, useStore } = createContext()
    
    export default function App({ initialBears }) {
      return (
        <Provider
          createStore={() =>
            create((set) => ({
              bears: initialBears,
              increase: () => set((state) => ({ bears: state.bears + 1 })),
            }))
          }
        >
          <Button />
        </Provider>
      )
    }

    迁移

    讨论:https://github.com/pmndrs/zustand/discussions/1276

    以下是使用 v4 API 的新上下文用法。

    import { createContext, useContext, useRef } from 'react'
    import { createStore, useStore } from 'zustand'
    
    const StoreContext = createContext(null)
    
    const StoreProvider = ({ children }) => {
      const storeRef = useRef()
      if (storeRef.current === null) {
        storeRef.current = createStore((set) => ({
          // ...
        }))
      }
      return <StoreContext.Provider value={storeRef.current}>{children}</StoreContext.Provider>
    }
    
    const useStoreInContext = (selector) => {
      const store = useContext(StoreContext)
      if (!store) {
        throw new Error('Missing StoreProvider')
      }
      return useStore(store, selector)
    }

    或者也可以使用一些提供类似 Zustand v3 API 的第三方库: