在 React 中,状态(State)是组件内部的数据结构,用于记录从挂载到卸载期间,可能会发生变化的数据。状态的更新会触发组件的重新渲染,因此合理地管理状态非常重要。

React 原生的状态管理,主要通过 useStateuseEffectContext API 实现,三者分别应用于不同的场景:

  • 局部状态管理:使用useState(函数组件)或this.state(类组件)管理局部状态。适用于组件内部的状态逻辑,如表单输入、开关状态等。

  • 生命周期和副作用useEffect(函数组件)和生命周期方法(类组件)允许在状态更新时执行副作用操作,如数据获取、订阅或手动DOM操作。

  • 跨组件状态共享Context API 允许跨组件共享状态,而无需通过每个组件手动传递 props。适用于主题切换、用户认证等全局数据。

对于比较复杂的状态,建议还是引入外部库来集中管理状态,毕竟随着代码量增多,随处可见的 useState 很难处理,Context API 也很难维护,且容易出错,而引入外部库则能显著提升开发效率,将更多精力放在模块化和逻辑优化上。

目前以 Redux 最为流行,另外 Mobx 和 zustand 也很受欢迎,社区普遍认为其相对于 Redux 而言,易用性和可维护性更好。以目前使用 Redux 的感受来看,有这三个优势:

  1. 单一数据源,且是树形结构,支持回溯,方便调试;
  2. 有成熟的开发调试工具 redux devtools;
  3. 有成熟的社区,一般遇到的疑难杂症,在社区通常都能找到解决方案;

由于只使用过 Redux,因此很难和其他库进行对比,而 React 的状态管理库又是五花八门,实在是卷得很,要想逐一了解,学习成本实在太高,还是选择较为流行的一两个就好。不过无论采取什么方式管理 React 状态,其基本思路是一致的:

  1. 最小化状态:尽可能减少状态数量,仅将那些需要根据用户交互或时间变化而变化的数据作为状态。
  2. 单一数据源:尽可能让状态在组件树中有单一的“真实来源”,避免不同组件间的状态不一致。
  3. 提升状态:当多个组件需要共享状态时,将状态提升到它们共同的父组件中管理。
  4. 不可变数据:在更新状态时,避免直接修改状态,而是通过设置新的状态值来创建新的状态对象。
  5. 组件化和复用:通过封装管理自己状态的组件,实现逻辑的复用和分离。