在如今的前端开发中,面对日益复杂且多样的应用场景,我们似乎都面临着一个负担:不得不安装多种状态管理库,感觉react hooks的理念有点过时了。不知道大家的项目里通常会引入多少个呢?在我自己的项目中,常用到的包括 Jotai、Zustand、React-Query,以及我自己实现的一些发布订阅模式(或者像 RxJS、Alien-Signals 这样的事件驱动库)。
聊聊这些库各自的优势与适用场景
Jotai
Jotai 是一款主打原子化的状态管理工具。它非常擅长处理小范围的组件级状态共享场景。
举个例子,如果你需要控制一个模态框的显示/隐藏状态,只需在模态框组件内部导出一个 atom,然后在需要使用的地方直接引入即可(也可以通过代理模式进行管理),而无需将其提升到页面级别的全局状态。
Jotai 也提供了衍生状态等高级能力,但如果尝试用它来承载复杂的页面级状态逻辑操作,代码组织上可能会变得比较混乱。
Zustand
Zustand 是一个表现均衡且通用的状态管理库。它在解决各种状态管理问题时,都能提供一个适中且高效的解决方案,无论是全局状态、局部状态,还是与其他 React 特性结合,都有不错的表现。
React-Query
React-Query 专注于解决服务端状态管理问题,同时也是一个非常出色的任务执行管理器。它与 React 生态中的许多库结合紧密,通常在安装这些库时,React-Query 也会被作为依赖项一并安装。既然都安装了,为什么不充分利用它的强大功能呢?
“服务端状态”是一个近年来兴起的概念,它主要指通过哈希(hash)来缓存接口数据。这意味着你不再需要像使用 Zustand 那样,自己额外编写一层逻辑来承接和管理接口返回的数据,React-Query 会自动帮你处理好数据的获取、缓存、更新和同步,极大简化了数据层面的开发。
事件驱动
有些业务逻辑是典型的事件驱动型,如果单纯依赖 React 的 dependency 数组来管理和维护,会变得非常棘手。
例如,我们业务中定义的登录流程,可能不仅需要从 SSO(单点登录)接收到 JWT Token,还需要完成特定任务后才能成功进入系统。这时就涉及两个依赖项了。如果使用 useEffect,不仅可能导致效果函数执行两次,还需要担心意外情况的发生,而实际上这只是一个单一的“登录事件”触发的逻辑。使用事件驱动库则能更好地解耦和管理这类复杂的、多步骤的事件流。
通过这些不同的状态管理工具,我们可以根据项目的具体需求和场景,选择最合适的方案,从而构建出更加清晰、可维护的前端应用。
大家在自己的项目中,是如何选择和搭配这些状态管理库的呢?大家觉得这种“百花齐放”的状态管理好,还是有一个唯一的库管理状态好一些呢?