两张图带你全面了解React状态管理库:zustand和jotai

react,zustand,jotai · 浏览次数 : 16

小编点评

Zustand和Jotai都是目前比较流行的React状态管理库,它们的共同特点是轻量、易用,并且与React Hooks完美结合。它们都使用了Immer库来实现状态的不可变更新,以提高性能。此外,它们的作者还开源了Valtio,一个状态库,但作者可能没有太多时间去深入研究。 Zustand的实现原理相对简单,通过全局生成一个store,提供getState、setState和subscribe方法。它与React 18的useSyncExternalStore配合使用,通过观察者模式监听store的变化并同步到组件中。Zustand还提供了selector来优化性能,只返回组件关注的state,避免不必要的渲染。 Jotai则更加推崇原子化,通过基础的atom派生出更复杂等级的atom,支持computed属性。它的实现原理包括生成依赖项、维护dependent列表以及在writeAtom时重新计算受影响的原子。Jotai还提供了一个Provider组件来维持全局的store,并使用useAtomValue和useSetAtom来监听和更新原子。 总的来说,Zustand和Jotai都是优秀的状态管理库,但它们的实现原理和最佳实践略有不同。开发者可以根据自己的需求和项目规模选择合适的库。

正文

zustandjotai 是当下比较流行的react状态管理库。其都有着轻量、方便使用,和react hooks能够很好的搭配,并且性能方面,对比React自身提供的context要好得多,因此被很多开发小伙伴所喜爱。

更有意思的是,这两个库的作者是同一个人,同时他还开源了另外一个状态库 valtio,并没来得及研究(表示卷不动了😭),这三个库的实现思路却是不同的,号称是以一己之力搅乱React 状态库生态圈的人。

Comparison: https://docs.pmnd.rs/zustand/getting-started/comparison

注:文中如有理解不正确点,可以随意指出。 图片如果看不清,可以私信我发。

zustand

zustand

zustand的实现原理相对简单,全局生成一个store,提供getState,setState以及subscribe,因此天然和React 18提供的useSyncExternalStore配合使用。

大致的原理:当set状态之后,useStore中会监听整个store的变化,然后同步组件中的状态,使受影响的组件重新更新。

BestPractise & 优化

通过代码分析,如果不想做一些无意义的render,推荐使用selector。使用selector主要有两个方面的优点:

  • 只返回组件自身关注的state,如果state没有变化,组件不会刷新,否则一旦store变化,state没有变化的组件也会随之刷新
  • 由于useSyncExternalStoreWithSelector本身提供的getSelection方法带有缓存效果,如果两次的snapshot相同,则不会进行selector的重复计算,这对于selector中如果本身有复杂逻辑的无疑是有性能优化的。
  • zustand是基于immutable数据的改变来引起组件重新渲染的,记得不要直接在对象中改值,而是返回一个全新的对象,这点可以配合 immer 使用,zustand也提供了相应的 middleware
  • best parctise

jotai

jotai

jotai的理解难度相对而言就难一些,jotai推崇原子化,通过基础的atom派生出更复杂等级的atom,因此jotai天然支持computed属性,对于zustand而言,想要实现computed属性,则需要魔改setState来达到目的。

原理

  • readAtom的时候,会顺次生成这个原子的依赖,维护在自身atomStated(depedencies)中,这将形成一个树形链表。
  • subscribleAtom的时候,会根据该原子的依赖项,生成dependent,这样做的目的是当该原子进行重新设值时,能够根据他的dependent来重新计算依赖它的原子的值,dependent会维护在mountedMap中,只有当sub之后,Atom才会被加入到mountedMap中。
  • writeAtom时,会根据mountedMap中的dependent,重新计算收到影响的原子,并且调用该原子的以及在mountedMap中受到影响的原子的listeners,这样会触发组件中收到影响的原子重新获取到最新的值。
  • 在React部分就相对简单一些,Provider维持一个全局的store,方便各个useAtomValue进行subuseAtomValue会监听原子的变化,从而进行rerender,以便获取到最新的值。useSetAtom调用writeAtom

BestPractise

搜了一圈,官网好像没有最佳实践的建议,个人根据一些理解,提出一些:

  • atom应该尽量小,每个原子尽量做的事情比较单一,不然全局一个atom进行subscribe并没有意义
  • 相关的atom原子应该尽量在维护在一个文件中,避免不必要的上下文切换,使得代码变得难以理解
  • 对于比较复杂的逻辑,通过派生原子或者组合原子的方式来维护
  • 只需要更新atom的时候,只需要调用useSetAtom就好,不subscribe就意味着不需要关心该atom的变化,从而不会引起不必要的更新

总结

没有总结,卷不动了。

与两张图带你全面了解React状态管理库:zustand和jotai相似的内容:

两张图带你全面了解React状态管理库:zustand和jotai

zustand 和 jotai 是当下比较流行的react状态管理库。其都有着轻量、方便使用,和react hooks能够很好的搭配,并且性能方面,对比React自身提供的context要好得多,因此被很多开发小伙伴所喜爱。 更有意思的是,这两个库的作者是同一个人,同时他还开源了另外一个状态库 va

周边上新,T恤上星:博客园T恤幸运闪系列,一款上架预售,一款上照预览

今天发布2款博客园T恤,一款上架预售,见上图中的前两张照片;一款上照预览,见上图中的后两张照片,未敢上架,先看看大家的评价。在第三版星星款设计被放弃后,我们痴星不改,还是想推出带星星的幸运闪系列T恤

[转帖]线上大量CLOSE_WAIT的原因深入分析

这一次重启真的无法解决问题了:一次 MySQL 主动关闭,导致服务出现大量 CLOSE_WAIT 的全流程排查过程。 近日遇到一个线上服务 socket 资源被不断打满的情况。通过各种工具分析线上问题,定位到问题代码。这里对该问题发现、修复过程进行一下复盘总结。 先看两张图。一张图是服务正常时监控到

上海成立生成式人工智能质量检验检测中心(质检中心)

文章(新闻):生成式人工智能如何保障可靠可信?上海建立首家质检中心为AI产品“体检” 上海市生成式人工智能质量检验检测中心(质检中心) 两张人眼看上去一模一样的照片,机器人读取后为何会攻击其中一张图呢? 因为不正常的照片中被嵌入了特殊的噪声,人工智能产品读取了带有攻击性的信息。【想起了嵌水印】 同样

最短路三种算法详解

# 最短路 最短路问题即,给你一张图,让你求出图中两点的最短距离。 这篇文章会讲解 $Dijkstra$、$Spfa$、$Floyd$ 三种算法,让您透彻理解最短路! ## Dijkstra ### 朴素版 题目: ![image](https://img2023.cnblogs.com/blog/

[转帖]Java使用火焰图查看系统瓶颈

场景 一般情况下,我们会对现有系统进行压测等方式,来了解系统最大的吞吐量等等,通过这种方式得知系统在生产环境下可扛住的压力,如果我们想了解在压测的链路过程中,是哪些地方执行时间过长,影响了系统的吞吐量,可以使用火焰图的方式来观察。 工具 生成火焰图需要两个工具: 1. async-profiler:

Web API接口返回实现类集合的姿势了解

大家好,我是沙漠尽头的狼。 一. 问题描述 如下图,定义两个子类Student和Employ,都继承自抽象类PersonBase: public abstract class PersonBase { public string Name { get; set; } protected Person

【Azure Developer】.Net 简单示例 "文字动图显示" Typing to SVG

问题描述 看见一个有趣的页面,可以把输入的文字信息,直接输出SVG图片,还可以实现动图模式。 示例URL: https://readme-typing-svg.demolab.com/?font=Fira+Code&pause=1000&color=F7F7F7&background=233911F

2.1万字,30张图详解操作系统常见面试题(收藏版)

耗时两周,新版的操作系统常见知识点/问题总结总算搞完了,手绘了30多张图。大家可以用来复习操作系统或者准备操作系统面试。对于大部分公司的面试来说基本够用了,不过,像腾讯、字节这种大厂的面试还是要适当深入一些。 这篇文章总结了一些我觉得比较重要的操作系统相关的问题比如 用户态和内核态、系统调用、进程和

[转帖]传统机械硬盘工作原理

如图,机械硬盘主要由 磁片、马达、磁头臂、磁头组成 磁片上有许多“小格”,能够存储两种极性,也就是所谓的010110等二进制,来达到存储数据的效果 在工作时,磁头可以判断极性,悬浮在磁片上几纳米,通过磁头臂与马达的旋转,就可以读取磁盘表面的数据 磁盘表面又会划分为无数的磁道和许许多多的扇区 假设磁盘