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

【Zustand】从复杂到简洁:Zustand 状态管理简化实战指南

回忆一下,我们在使用Zustand时,是这样引入状态的(如下),通过解构的方式引入状态,但是这样引入会引发一个问题!

1.对象解构

比如说:

  • A组件用到了 hobby.rap 状态,而B组件 没有用到 hobby.rap 状态。
  • 但是更新hobby.rap这个状态的时候,A组件和B组件都会重新渲染。
  • 这样就导致了不必要的重渲染,因为B组件并没有用到hobby.basketball这个状态。

缺点:

  • 重复渲染,如果 useUserStore 中定义得其他 state 状态值改变。
  • 当前组件并没有用到其他state状态, 也是会触发渲染,产生性能问题!
  • 我们可以通过, 状态选择器、useShallow 来解决上面所说问题!
// A组件
import useUserStore from '../store/user'
const { hobby, name } = useUserStore()return (<div className="left"><h1>A组件</h1><div><h3>{name}</h3><div>{hobby.rap}</div></div></div>
)// B组件
const { name } = useUserStore()
return (<div className="left"><h1>B组件</h1><div><h3>{name}</h3></div></div>
)

2.状态选择器

  • 所以为了规避这个问题,我们可以使用状态选择器,状态选择器可以让我们只选择我们需要的部分状态,这样就不会引发不必要的重渲染。
  • 缺点:用到一个属性就需要手动定义一个,很麻烦、易出错。
import useUserStore from '../store/user'const name = useUserStore((state) => state.name)
const rap = useUserStore((state) => state.hobby.rap)

3.useShallow

Zustand 默认情况是它会严格比较两个对象是否相等, 没更新属性一次都会重新渲染!

  • 包裹 useShallow 之后,虽然返回的是一个新的对象,但是不会去对比两个新对象的引用地址;

  • 而是对比里面的属性是否发生变化,若是属性发生变化就会重新渲染;

  • 如果属性中没有包含 name, 它就不会去对比,也不会去更新!从而避免更新问题;

import { useShallow } from 'zustand/react/shallow';const { rap } = useUserStore(useShallow((state) => ({rap: state.hobby.rap,
})))

4.总结

使用 useShallow hooks 简化状态才是最优解。

http://www.dtcms.com/a/303413.html

相关文章:

  • 图解系统的学习笔记--硬件结构
  • 告别繁琐 Mapper!Stream-Query 正式入驻 GitCode 平台
  • GPFS文件系统更换磁盘
  • 企业级JWT验证最佳方案:StringUtils.hasText()
  • AD中放置过孔阵列
  • Python 异常 (Exception) 深度解析
  • 如何获取我当前的IP地址
  • 掌握 ArkTS 复杂数据绑定:从双向输入到多组件状态同步
  • AWS MemoryDB 可观测最佳实践
  • Python Pandas.merge_ordered函数解析与实战教程
  • 全球首个1米高精度特大城市开放空间数据集(Tif)
  • 力扣刷题977——有序数组的平方
  • 热门JavaScript库“is“等软件包遭npm供应链攻击植入后门
  • “菜鸟的java代码日记“ DAY3——跳跃游戏(中等)
  • DBAPI的SQL实现模糊查询的3种方案
  • [论文阅读] 人工智能 | 机器学习工作流的“救星”:数据虚拟化服务如何解决数据管理难题?
  • 数据结构面经
  • 《中国棒球》cba球队有哪些球队·棒球1号位
  • MySQL 查询重复数据的方式总结
  • 历史版本vscode的下载地址
  • 从黑客松出发,AI + Web3 项目怎么打磨成产品?
  • vue2中实现leader-line-vue连线文章对应字符
  • 事务实现的底层原理
  • SwinTransformer改进(14):集成MLCA注意力机制的Swin Transformer模型
  • 机器学习基础-numpy
  • 【JavaScript】const 定义的对象禁止修改内部属性
  • USRP X410 X440 5G及未来通信技术的非地面网络(NTN)
  • Windows10镜像下载
  • 策略路由—PBR
  • laravel chunkById导出数据乱序问题