5分钟弄懂react状态管理前世今生

date
Sep 14, 2023
slug
react_state_management
status
Published
tags
Website
react
frontend
前端
summary
状态表示组件当前状况的js对象。可以使用useState去维护这些状态,通过props传递给子组件。 为了避免状态传递过程中的混乱react引入了“单向数据流的概念”。
type
Post
notion image
 

状态

表示组件当前状况的js对象。可以使用useState去维护这些状态,通过props传递给子组件。
为了避免状态传递过程中的混乱react引入了“单向数据流的概念”。

状态管理库要解决的问题

  1. 组件树的「任何地方」读取存储状态
  1. 写入能力
  1. 提供「优化渲染」的机制
  1. 提供优化内存使用的机制
  1. 与「并发模式」的兼容性
  1. 数据的持久化
  1. 上下文丢失的问题
  1. props失效的问题
  1. 「孤儿」问题

React Context(outdated see useContext)

不想父传子一层层传递,从而把数据状态抽象到公共的地方,使用contextapi,组件树上的组件都可以共享这些状态。

Class时代

Redux

 
工作流程大致如下
  • 用户在view层触发某个事件,通过dispatch发送了action和payload
  • action和payload被传入reducer函数,返回一个新的state
  • store拿到reducer返回的state并做更新,同时通知view层进行re-render
优点:
  • 繁荣的社区,扩展性好,有很多中间件
  • 单一的数据源且是树形结构,有redux-devtool可以调试
缺点
  • 有一些学习成本
  • 模版代码相对比较多,造成额外成本
  • 状态比较多的时候,性能比较差,state更新会影响所有组件
  • reducer要返回的是一个新对象,如果要更新的值比较深,成本也很

Dva

对redux的使用层面的升级,降低了上手难度,但是钩子出现之后现在已经不维护了

Zustand

zustand 是一个轻量级状态管理库,和 redux 一样都是基于不可变状态模型和单向数据流的,状态对象 state 不可被修改,只能被替换。渲染优化要手动通过 selectors 进行。

Zustand vs Redux

  • 都基于单向数据流。
  • 不过,redux 需要应用被 Context Provider 包裹,zustand 则不需要,只需要一个钩子。
  • 模版代码更少
  • 对typescript支持更好

© bai xin 2021 - 2025

沪ICP备20011311号-1