1. 状态结构设计
- 模块化设计:
- 将每个模块的状态分开定义,例如对于用户相关模块,定义
userState
,产品相关模块,定义 productState
等。这样每个模块专注于自己的状态管理,易于维护和理解。
- 在 Zustand 中,可通过如下方式定义:
import create from 'zustand';
const useUserStore = create((set) => ({
user: null,
setUser: (newUser) => set({ user: newUser })
}));
const useProductStore = create((set) => ({
products: [],
addProduct: (product) => set((state) => ({ products: [...state.products, product] }))
}));
- 分层结构:
- 如果模块间存在层级关系,状态结构也应体现这种关系。比如有一个电商应用,订单模块依赖用户模块和商品模块,那么状态结构可设计为:
const useAppStore = create((set) => ({
user: null,
products: [],
orders: [],
setUser: (newUser) => set({ user: newUser }),
addProduct: (product) => set((state) => ({ products: [...state.products, product] })),
createOrder: (order) => set((state) => ({ orders: [...state.orders, order] }))
}));
- 这种方式便于整体把控应用状态,同时各模块可按需访问部分状态。
2. 管理状态变化
- 单一职责原则:
- 每个 Zustand 状态管理函数应只负责一个特定的状态变化操作。例如,
setUser
函数只负责更新用户状态,addProduct
函数只负责添加产品到产品列表。
- 这样当状态变化逻辑需要修改时,可直接定位到相应函数,不会影响其他无关逻辑。
- 中间件和日志记录:
- 使用 Zustand 的中间件来添加额外功能,如日志记录。通过记录状态变化,便于调试和追踪问题。
import create from 'zustand';
import { devtools } from 'zustand/middleware';
const useAppStore = create(devtools((set) => ({
count: 0,
increment: () => set((state) => ({ count: state.count + 1 }))
})));
- 这里 `devtools` 中间件可在开发环境下记录状态变化历史。
3. 处理模块间状态通信
- 发布 - 订阅模式:
- 利用自定义事件或 Zustand 状态变化监听来实现。例如,当用户模块状态发生变化时,通知依赖该状态的其他模块。
const useUserStore = create((set) => ({
user: null,
setUser: (newUser) => {
set({ user: newUser });
// 发布事件通知其他模块
window.dispatchEvent(new CustomEvent('userStateChange', { detail: newUser }));
}
}));
// 其他模块监听事件
window.addEventListener('userStateChange', (event) => {
const newUser = event.detail;
// 根据新用户状态更新自身状态
});
- 共享状态管理:
- 如果多个模块频繁交互状态,可将这些共享状态提取到一个公共的 Zustand 存储中。例如,一个多页面应用,顶部导航栏和内容区域都依赖用户登录状态,可将登录状态放在一个共享存储中。
const useSharedStore = create((set) => ({
isLoggedIn: false,
setLoggedIn: (status) => set({ isLoggedIn: status })
}));
- 导航栏和内容区域组件都使用 `useSharedStore` 来获取和更新 `isLoggedIn` 状态。