跳至主要内容

Recoil 0.6

·阅读时间:4 分钟

Recoil 0.6 引入了对 React 18 的改进支持,包括并发渲染和过渡,以及新的 API、修复和优化。

React 18

Recoil 0.6 使用来自 React 18 的最新 API 来提高安全性并提升性能。此版本与 并发渲染<React.StrictMode> 兼容,这对于测试和识别并发渲染的潜在问题很有用。在同一批次中进行 Recoil 和 React 状态更改现在可以保持同步,以提供一致的状态视图。其中一些改进在使用以前版本的 React 时也可用。在尝试 React 18 时,请使用最新的 RC 版本,因为原始的 React 18.0.0-rc.0 包存在一个已修复的错误。

并发渲染和过渡

React 18 提供了一个新的挂钩 useTransition(),用于在过渡到新状态时控制在准备好新状态之前要渲染的内容。Recoil 应该与这种方法兼容,并提供与 React 状态一致的视图。但是,React 18 可能会从并发更新中回退,并且尚未正式支持基于对外部存储的状态更改启动过渡。这是 React 团队正在研究支持的,但在那之前,我们通过以下挂钩添加了实验性支持。此 API 被认为是实验性的,因为可能存在我们尚未发现的用例,这些用例未得到处理。

  • useRecoilState_TRANSITION_SUPPORT_UNSTABLE()
  • useRecoilValue_TRANSITION_SUPPORT_UNSTABLE()
  • useRecoilValueLoadable_TRANSITION_SUPPORT_UNSTABLE()

以下是一个示例,它在加载新结果时显示当前结果

function QueryResults() {
const queryParams = useRecoilValue_TRANSITION_SUPPORT_UNSTABLE(queryParamsAtom);
const results = useRecoilValue_TRANSITION_SUPPORT_UNSTABLE(myQuerySelector(queryParams));
return results;
}

function MyApp() {
const [queryParams, setQueryParams] = useRecoilState_TRANSITION_SUPPORT_UNSTABLE(queryParamsAtom);
const [inTransition, startTransition] = useTransition();
return (
<div>
{inTransition ? <div>[Loading new results...]</div> : ''}
Results: <React.Suspense><QueryResults /></React.Suspense>
<button
onClick={() => {
startTransition(() => {
setQueryParams(...new params...);
});
}
>
Start New Query
</button>
</div>
);
}

新功能

重大变更

  • 原子效应
    • 将选项从 effects_UNSTABLE 重命名为 effects,因为该接口正在逐渐稳定。(#1520
    • 原子效应 初始化优先于 <RecoilRoot initializeState={...}>。(#1509
  • useGetRecoilValueInfo_UNSTABLE()Snapshot#getInfo_UNSTABLE() 始终报告节点 type。(#1547
  • 0.3 版本引入了对快照进行保留以供将来使用的需求,但这主要是一个警告。现在,必须保留快照才能解析异步选择器。请参阅 此处此处 的文档。未来的版本将进一步强制执行此操作,因为垃圾回收将被释放。

其他修复和优化

  • 减少快照克隆的开销
    • 仅在回调实际使用快照时才克隆当前快照。(#1501
    • 缓存来自回调的克隆快照,除非发生状态更改。(#1533
  • 修复某些情况下传递选择器刷新的问题 (#1409)
  • 修复异步选择器和多个存储的一些极端情况 (#1568)
  • 原子效应
    • useRecoilTransaction_UNSTABLE() (#1466#1569) 中的事务期间,原子在通过 set() 初始化时运行原子效应。
    • 当由已释放的快照初始化时,原子效应将被清理。(#1511#1532
    • 在原子被清理时取消订阅原子效应中的 onSet() 处理程序。(#1509
    • 当原子使用 <RecoilRoot initializeState={...} > 初始化时调用 onSet() (#1519#1511
  • 在某些情况下,当组件使用不同的原子/选择器时,避免额外的重新渲染。(#825
  • <RecoilRoot> 仅在初始渲染期间调用 initializeState() 一次。(#1372
  • 延迟计算和记忆懒惰属性的结果,例如来自 useGetRecoilValueInfo()Snapshot#getInfo_UNSTABLE()。(#1548#1549