动机
出于兼容性和简化性的考虑,最好使用 React 的内置状态管理功能,而不是外部全局状态。但 React 有一些限制
- 组件状态只能通过将其向上推送到共同祖先来共享,但这可能包括一个巨大的树,然后需要重新渲染。
- 上下文只能存储单个值,而不是每个都有自己的消费者的无限集值。
- 这两者都使得将树的顶部(状态必须存在的地方)与树的叶子(状态使用的地方)进行代码拆分变得困难。
我们希望在保持 API 和语义和行为尽可能 React 化的同时,改进这一点。
Recoil 定义了一个有向图,它与你的 React 树正交,但也是内在的,并且与你的 React 树相连。状态变化从该图的根(我们称之为原子)通过纯函数(我们称之为选择器)流入组件。通过这种方式
- 我们得到了一个无样板 API,其中共享状态具有与 React 本地状态相同的简单 get/set 接口(但如果需要,可以封装在 reducer 等中)。
- 我们有可能与并发模式和其他新的 React 功能兼容,因为它们变得可用。
- 状态定义是增量的和分布式的,使代码拆分成为可能。
- 状态可以用派生数据替换,而无需修改使用它的组件。
- 派生数据可以在同步和异步之间移动,而无需修改使用它的组件。
- 我们可以将导航视为一个一流的概念,甚至将状态转换编码到链接中。
- 可以轻松地以向后兼容的方式持久化整个应用程序状态,因此持久化的状态可以存活应用程序更改。