一、状态管理:
React遵循的是单向数据流的原则,属性通过props自上而下的传递,页面复杂的时候,组件的嵌套层级一深,会造成“嵌套地狱”,状态管理解决的是这种“嵌套地狱”的问题,是跨层级组件之间的数据通信和状态共享。
(一)状态管理的本质:管理共享内存中的状态
1、共享内存;2、管理状态;3、页面通信;4、组件通信。
二、状态管理工具
1、Local State(组件级别的局部状态):
当组件创建时初始化和生效,组件销毁时生效。向上延伸时需要有一个度,在前端开发中,认为是子页面,单页应用中子页面以子页面之下的组件可以用local state来解决状态管理问题的。
2、context:
(1)context解决了react中props或者state进行多级数据传递,则数据需要自顶下流经过每一级组件,无法跨级的问题;
(2)context相当于全局变量,难以追溯数据的变更情况;
(3)使用context的组件内部耦合度太高,不利于组件的复用和单位测试;
(4)会产生不必要的更新(穿透memo和dependdicies等);
(5)context只能存储单一值,无法存储多个各自拥有消费者的值的集合;
(6)多个context会存在层层嵌套的问题。
3、redux:
redux由flux演变而来,flux是Facebook官方给出的应用架构,利用数据的单向流动形式对公共状态进行管理。
(1)view:视图层;
(2)action:视图发出的消息;
(3)dispatcher:派发者,用来接收action,执行回调函数;
(4)store:数据层,存放状态,一旦发生改动,就会更新数据以及emit相关事件等。
flux的缺点:
(1)UI组件和容器组件的拆分过于复杂;
(2)action和dispatcher绑定在一起;
(3)不支持多个store;
(4)store被频繁的引入和调用。
redux的三大原则:单一数据源,store中的state是只读的,使用纯函数来执行修改。
4、mobx:
可以直接修改状态,不需要编写繁琐的action和reducer,也不需要引入各种复杂的中间件,局部精确更新,免去了粒度控制烦恼,自始至终一份引用,不需要immutable,也没有复制对象的额外开销,但它不能实现时间旅行和回溯,因此不太适合前端数据流比较复杂的场景。
5、recoil:
提供了与cocurrent模式及其他react新特性兼容的可能性,主打的是性能,因为其原子性的特点,比较容易做到细粒度的状态控制,也能跟redux实现状态回溯。
6、zustand:
通过函数合并更新状态,同时提供replace标志位直接将旧状态完全替换。