React状态管理 |青训营笔记

87 阅读3分钟

React状态管理

状态管理

解决“嵌套地狱”的问题,解决的是跨层级组件之间的数据通信和状态共享

本质:管理共享内存中的状态

React状态管理工具多,是因为React将状态的变动完全交给开发者

React状态管理简介

React状态管理工具可以分为以下几类:

  • React自带:Local State(props)和Context
  • 单向数据流:Flux、Redux(Redux一toolkit)
  • 双向数据绑定:Mobx
  • 原子型状态管理:Recoil、Jotai
  • 异步操作密集型:Rxjs 每一种状态管理工具都有其不同的适用性,不同场景下需要合理的选择状态管理工具。

image.png

  1. Local State

​ 单页面中,子页面及子页面以下的组件都可以用local State解决状态管理

子页面和子页面之间通信时Local State无法满足需求

  1. Context

    用于子页面和子页面之间通信

    渲染力度不可控,会生成过多渲染

    • Context相当于全局变量,难以追溯数据变更情况,做不到Redux的回溯
    • 使用Context的组件内部耦合度太高,不利于组件的复用和单元测试
    • 会产生不必要的更新
    • Context只能存储单一值
    • 粒度不好控制
    • 多个Context会存在层层嵌套
    • 不同页面相同属性可以放在Context中
  2. Redux

是从Flux演变而来的,Flux是利用数据的单向流动的形式对公共状态进行管理

Flux缺点:

  • UI组件和容器组件拆分过分复杂
  • Action和Dispatcher绑定在一起
  • 不支持多个store
  • store被频繁引用

image.png

Redux三大原则:单一数据源,只有一个store、store中的state是只读的、使用纯函数来执行修改

可以做时间旅行,适用大型Web项目

缺点:样板代码多,复杂度高

4.Mobx

借助于装饰器实现,代码简洁易懂,可以直接修改状态,没有Redux繁琐的actions和reducers

缺点:多于灵活,代码风格很难统一,不能时间旅行和回溯

5.Recoil

团队开发的,可以任意组合,具有原子性的原子状态,可以实现完美的局部更新,通过Atom组合衍生出状态Selector

可以细粒度状态控制,状态回溯,实现状态快照

6.Zustand

轻量级,适合移动端网页,核心是通过setState来直接修改状态,Redux通过dispatch和Reducer来进行状态更新

实现一个简易的状态管理工具

状态管理工具都是基于发布/订阅模式实现的

image.png

Redux在项目中的实践

注意:不要把所有状态都放入React当中

image.png

如果存在副作用函数,首先处理副作用函数,然后生成原始的js对象。如何处理副作用操作.在redux中选择在发出action,到reducer处理函数之间使用中间件处理副作用。在有副作用的action和原始的action之间增加中间件处理,从图中我们也可以看出,中间件的作用就是:转换异步操作,生成原始的action,这样,reducer函数就能处理相应的action,从而改变state,更新UI。

Redux toolkit 用redux需要有太多的样板代码,中间件代码等等,还需要区别同步和异步操作,及其复杂。Redux toolkit可以简化Redux开友,包括配直Store、定义Reducer、不可变的更新逻辑、可以立即创建整个个状态的“切片slice",而无需手动编写任何action creator 或者action type。此外,Redux toolkit提供了完整的React的hooks,可以方便React函数组件中使用Redux toolkit。