项目集成zustand后,如何构建和使用,以及devtools函数。
1. import { devtools } from 'zustand/middleware'; 这个devTools的作用是?
提供的是 Redux DevTools 集成 中间件。把它包在 store 外面,就能在浏览器里用 Redux DevTools Extension 做以下事:
- 查看/回放每一次状态变更
每条 setState 都会以 action 形式记录,可时间旅行调试。 - 查看当前状态快照
DevTools 面板直接显示 store 的完整 JSON。 - 手动 dispatch action 修改状态
在 DevTools 里输入 JSON 即可立即改变 store。 - 性能分析
记录每次变更耗时,发现不必要的重渲染。
2. 怎么在zustand中使用devtools
在 Zustand 里启用 devtools
只需两步:
- 浏览器装好 Redux DevTools 扩展;
- 用
devtools
中间件包一下create
。
注意:若想同时用 persist / immer
等其他中间件,把 devtools
包在最外层即可
举例
// store.ts
import { create } from 'zustand';
import { devtools } from 'zustand/middleware';interface State {count: number;inc: () => void;
}export const useStore = create<State>()(devtools((set) => ({count: 0,inc: () => set((state) => ({ count: state.count + 1 }), false, 'inc'),}),{ name: 'counter', // DevTools 面板中显示的名字enabled: process.env.NODE_ENV === 'development', // 只在开发环境启用} )
);
3. enabled、name属性的作用是什么?
属性 | 类型 | 默认值 | 说明 |
name |
| 无 | 在 Redux DevTools 面板里显示的 Store 名称,便于区分多个 Store。 |
enabled |
|
| 是否真正启用 DevTools。设为 |
4. 定义好store.ts后,我在我的组件中如何打印userInfo的username以及修改userName?
// 只取 username,避免整对象更新
const username = useUserStore((state) => state.userInfo.username);
console.log('当前用户名:', username);
const setUserName = useUserStore((state) => state.setUserName); // 假设你在 store 里暴露了 setUserName
<button onClick={() => setUserName('新名字')}>改名字</button>
5. const userInfo_Sample = useUserStore((state) => state.userInfo); 之前redux中的写法,这种写法还可以吗? 支持吗?
可以,支持。