当前位置: 首页 > news >正文

学习 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.stringifyJSON.parse把值设置为 JSON 字符串进行存取

疑问

  • zustand.set 的返回值直接覆盖全部 state 还是做数据合并到 state 中?
    由第二个参数控制,默认是 false 标识数据合并,当返回 true 时候,是直接覆盖。

  • 当一次从 store 中获取多个数据时候,建议使用 zustand/react/shallow 有啥用?
    可以进行浅比较,避免没必要的渲染,和所有的浅比较一样,也会引入数据变化无感知的困惑,可以结合 devtools 来检查

  • 对比 UpdateObj.tsxUpdateObj2.tsxShallowEqual.tsx 中获取 store 数据的方式,为什么只有 UpdateObj.tsx 可以监听到变化?

    • UpdateObj.tsxUpdateObj2.tsx 都没有使用 useShallow
      但是 UpdateObj2.tsx(state) => stat.user 每次返回的都是 store 中的 user,所以对组件而言路径地址没变,所以不触发刷新。
      UpdateObj.tsx(state) => ({user: stat.user}) 每次返回的都是一个新的 {user: xxx} 对象,地址一直在变,所以触发刷新
    • UpdateObj.tsxShallowEqual.tsx 获取数据一样,每次都返回一个新的 {user: xxx} 对象,但是 useShallow 内的 shallow 算法是 Object.keys 一致,以及第一层的 obj[key] 的值一致(使用 Object.is 比较),就算做未变更,所以不触发刷新。在这两个组件中 {user: xxx} 虽然是两个对象,但是它们 kyes 一样都是 ["user"],然后指向的都是 stroe.user 这个地址一致,所以算作未变化。这要小心使用呀。shallow.ts 源码
http://www.lryc.cn/news/325734.html

相关文章:

  • 竞赛 opencv python 深度学习垃圾图像分类系统
  • vsto worksheet中查找关键字【关键字】获取对应的整列 union成一个range
  • flask_restful规范返回值之参数设置
  • 基于java+springboot+vue实现的超市管理系统(文末源码+Lw+ppt)23-354
  • AI大模型学习:开启智能时代的新篇章
  • 【字符串】字符串哈希
  • MacOS快速安装FFmpeg、ffprobe、ffplay
  • 数据结构 之 树习题 力扣oj(附加思路版)
  • 闭包学习,闭包和高阶函数
  • Linux实战笔记(五) shell
  • TCP Wrappers 的使用
  • 数据结构——lesson11排序之快速排序
  • Nacos部署(二)Linux部署Nacos2.3.x集群环境
  • RuoYi 自定义字典列表页面编码翻译
  • GAMES101 学习4
  • Redis中的缓存穿透
  • javaSwing超市收银(txt)
  • Linux 理解文件系统、磁盘结构、软硬链接
  • 智慧商场数字化创新需要有数字能力帮手
  • JS加密解密之应用如何保存到桌面书签
  • 线上linux服务器升级nginx
  • 使用JDK提供的常用工具在多线程编写线程安全和数据同步的程序
  • 八道Python入门级题目及答案详解
  • Git 的cherry-pick含义
  • 大数据中TopK问题
  • 基于SpringBoot+MyBatis+Vue的电商智慧仓储管理系统的设计与实现(源码+LW+部署+讲解)
  • C++经典面试题目(四)
  • 2024/3/24 蓝桥杯
  • 用户验证:Streamlit应用程序与Streamlit-Authenticator
  • 风丘EV能量流测试解决方案 提高电动汽车续航能力