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 组件外部使用。相反,我们使用了 getState 和 setState 方法来直接与 store 进行交互。
虽然这种方法允许你在非 React 环境下操作 Zustand store,但它并不提供 React 组件的响应性。也就是说,当你改变状态时,React 组件不会自动重新渲染。如果需要在非 React 环境下实现类似的功能,你可能需要手动触发相应的逻辑来处理状态变化。对于纯 JavaScript 或者 Node.js 后端等非前端场景,这通常不是问题,因为你可能不需要前端的响应式更新机制。