本文主要是介绍学习 zustand,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
学习 zustand
- https://github.com/pmndrs/zustand
- 告别繁杂的状态管理:Zustand 的简洁之道
- Zustand 状态库:轻便、简洁、强大的 React 状态管理工具
- 关于 zustand 的一些最佳实践
代码库 https://gitee.com/nian_zuo_chen/learnrect/tree/master/zustand
安装
npm install zustand
常用
create
创建一个store
set
函数修改store
内容get
函数,获取当前store
中内容store.getState()
静态获取当前store
的所有内容store.subscribe(listener)
订阅store
变更,任意一个值变更,都会执行listener
useShallow
可以开启浅比较,对象属性变化不触发
中间件
subscribeWithSelector
在创建store
时候增加,允许订阅的时候增加选择器,来限制监听的范围listener
中返回的数据和选择器选择的内容一致。devtools
在创建store
时候增加,结合redux-dev-tools
浏览器插件可以查看 store 变化- 处理持久化,
persist
开启持久化,createJSONStorage
使用JSON.stringify
和JSON.parse
把值设置为JSON
字符串进行存取
疑问
-
zustand.set
的返回值直接覆盖全部 state 还是做数据合并到 state 中?
由第二个参数控制,默认是 false 标识数据合并,当返回 true 时候,是直接覆盖。 -
当一次从
store
中获取多个数据时候,建议使用zustand/react/shallow
有啥用?
可以进行浅比较,避免没必要的渲染,和所有的浅比较一样,也会引入数据变化无感知的困惑,可以结合devtools
来检查 -
对比
UpdateObj.tsx
、UpdateObj2.tsx
和ShallowEqual.tsx
中获取store
数据的方式,为什么只有UpdateObj.tsx
可以监听到变化?UpdateObj.tsx
、UpdateObj2.tsx
都没有使用useShallow
但是UpdateObj2.tsx
中(state) => stat.user
每次返回的都是store
中的user
,所以对组件而言路径地址没变,所以不触发刷新。
而UpdateObj.tsx
中(state) => ({user: stat.user})
每次返回的都是一个新的{user: xxx}
对象,地址一直在变,所以触发刷新UpdateObj.tsx
和ShallowEqual.tsx
获取数据一样,每次都返回一个新的{user: xxx}
对象,但是useShallow
内的shallow
算法是Object.keys
一致,以及第一层的obj[key]
的值一致(使用Object.is
比较),就算做未变更,所以不触发刷新。在这两个组件中{user: xxx}
虽然是两个对象,但是它们kyes
一样都是["user"]
,然后指向的都是stroe.user
这个地址一致,所以算作未变化。这要小心使用呀。shallow.ts 源码
这篇关于学习 zustand的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!