useReducer和useContext的结合可以取代Redux?

1,331 阅读1分钟

useReducer 是 useState 的升级版本,用来践行 Redux 的思想

使用 useReducer 代替 Redux

使用 createContext/useContext 模拟 Redux 的全局数据状态管理的作用域,useReducer 来表示全局数据状态管理中的所有读写操作。

在创建的上下文对象中能够及时更新数据,就类似于一个局部的 Redux。

但是useReducer绝对无法取代Redux

主要问题useReducer+useContext维护的状态还只是一个强耦合于UI的状态。这写状态的生命周期完全局限于在函数组件内部,这个状态是在在组件函数作用域内创建的,和UI组件是耦合在一起而没有真正分离。但是有的状态是需要完全独立于UI的,需要完全UI无关地进行维护,UI组件只是状态的一个消费者,而不是定义和初始化状态的地方。Redux可以做到分离,但useReducer+useContext不能。另外Redux有thunk之类的中间件支持async action,而useReducer没有,还得用其他库。useContext+useReducer说白了就是项目很小,只有少部分祖孙组件间需要共享状态时才会使用的一个简易共享方案。真正较复杂的情况那必然还是用Redux。

看具体业务场景,useContext的问题是如果数据发生变化,整个子树都会重新渲染,性能可能会有问题。可以尝试去优化,但不一定可以解决。