如何在js中使用zustand?

208 阅读2分钟

Zustand 主要是为 React 设计的状态管理库,它利用了 React 的 Hooks API。这意味着它的主要用途是在 React 组件中通过自定义 Hooks 来管理和访问状态。然而,Zustand 的核心 store 可以在任何 JavaScript 文件中创建和使用,因为它本质上只是一个普通的 JavaScript 函数和对象。

如果你想要在非 React 组件的 JavaScript 文件中使用 Zustand store,你可以直接调用 store 提供的方法来获取或修改状态,但你不会得到 React 组件自动重新渲染的好处。例如,你可以在服务层或者工具函数中调用这些方法来读取或更新状态。

下面是一个例子说明如何在非 React 环境中使用 Zustand store:

创建 Store

首先,你需要像之前那样创建一个 Zustand store:

// store.js
import { create } from 'zustand';

const useStore = create((set) => ({
    count: 0,
    increment: () => set((state) => ({ count: state.count + 1 })),
    decrement: () => set((state) => ({ count: state.count - 1 })),
}));

export default useStore;

在非 React 文件中使用 Store

假设你有一个普通的 JavaScript 文件(非 React 组件),你想要在这个文件中更新状态:

// someService.js
import useStore from './store';

// 直接调用 store 中的方法来修改状态
function updateCount(newCount) {
    // 注意:这里我们不能直接使用 useStore hook,
    // 因为它只能在 React 函数组件或自定义 Hooks 内部使用。
    // 但我们可以通过 getState 方法来获取当前状态,
    // 并通过 setState 方法来更新状态。
    const getState = useStore.getState();
    const setState = useStore.setState;

    // 更新状态
    setState({ count: newCount });
}

// 获取当前状态
function getCurrentCount() {
    return useStore.getState().count;
}

// 示例调用
updateCount(5);
console.log(getCurrentCount()); // 输出应该是 5

请注意,在上面的例子中,我们并没有使用 useStore hook,因为 hooks 不能在 React 组件外部使用。相反,我们使用了 getStatesetState 方法来直接与 store 进行交互。

虽然这种方法允许你在非 React 环境下操作 Zustand store,但它并不提供 React 组件的响应性。也就是说,当你改变状态时,React 组件不会自动重新渲染。如果需要在非 React 环境下实现类似的功能,你可能需要手动触发相应的逻辑来处理状态变化。对于纯 JavaScript 或者 Node.js 后端等非前端场景,这通常不是问题,因为你可能不需要前端的响应式更新机制。