在这个指南中我们将要学习Recoil.js,一个高效的状态管理和更好的组件渲染周期的React新库。
这篇文章是从官方文档提炼出来的,如果想了解全部文档内容请参考官方文档。
Recoil是啥?
使用Recoil,你可以创建一个数据流图,该图从Atom(共享状态)Selector(纯函数)一直流到React组件。Atom是组件可以订阅的状态单位。Selectors 使用同步或者异步的方式转换状态。
Recoil.js 由ATOMS 和 SELECTOR 组成
- Atoms Atoms是状态的单位,可更新、可订阅。当atom更新了,每一个订阅他的组件都会使用新的值进行重新渲染。atom也可以在运行时创建。可以使用Atoms代替React本地组件状态。如果从多个组件中使用同一个Atom,那么所有这些组件共享它们的状态。
现在,上面的atom(一段状态代码)可以被多个组件使用,就像普通的useState变量一样,也可以改变这个全局状态。
使用Atoms: 在多个组件中使用相同的Atom,改变Atom状态所有的组件都会响应。
2. Selectors: Selector是一个纯函数,它接受原子或其他Selector作为输入。当这些上游Atom或Selector被更新时,该Selector函数将被重新执行。组件可以像订阅Atom一样订阅
Selector,当Selector发生改变时,组件将被重新渲染。
Selector用于计算基于状态的派生数据。这使我们避免了冗余状态,通常无需使用reduce来保持状态同步和有效性。取而代之的是,最小状态集存储在Atom中,而其他所有内容都根据该最小状态进行有效计算。由于选择器可以跟踪哪些组件需要它们,以及它们依赖什么状态,因此,它们使这种功能方法更加高效。
get属性是计算函数,通过传递给他Atom或者Selector来获取相应值。每当它访问其他的Atom或选Selector时,就会创建一个依赖关系,这样更新Atom或Selector时就会导致该Atom或Selector被重新计算。
在这个userNameFormatState实例中,selector有一个依赖:userNamState。从概念上讲,userNameFormatState Selector的行为就像一个纯函数,它以userNameState作为输入,并返回一个格式化的结果作为输出。
Selector可以使用useRecoilValue()来读取,它以Atom或Selector作为参数,并返回相应的值。我们不使用useRecoilState(),因为userNameFormatState Selector是不可写的。
异步数据查询
Recoil提供了一种方法,该方法通过数据流图的方式将状态和派生状态映射到React组件。真正强大的是图中的函数也可以是异步的。在同步React组件渲染函数中使用异步函数变得很容易。在selector的数据流图中, Recoil可以让你随意的混合使用同步和异步函数。只需从selector get回调中返回一个Promise而不是一个值本身,接口完全一样。因为这些只是Selector,其他的Selector也可以依赖它们来进一步变更数据。
使用参数查询
有时候你想基于参数进行查询,而不是基于派生的状态。例如:你可以想基于组件的属性进行查询,你可以使用selectorFamily 来实现
当获取数据的时候显示loading
我们也可以使用 useRecoilValueLoadable() hook在渲染是来确定状态
感谢 感谢