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>
);
}
新功能
- Recoil 回调
useRecoilCallback()
现在也可以刷新选择器缓存,类似于useRecoilRefresher_UNSTABLE()
。(#1413)- 使用
getCallback()
的选择器中的回调现在可以像useRecoilCallback()
一样,除了读取状态外,还可以修改、刷新和事务状态。(#1498)
- 存储 ID - 现在可以使用
useRecoilStoreID()
(#1417) 或 原子效应 (#1414) 中的storeID
参数获取StoreID
。 RecoilLoadable.of()
和RecoilLoadable.all()
工厂现在可以接受字面量值、异步 Promise 或 Loadable。这与Promise.resolve()
和Promise.all()
相当。(#1455,#1442)。- 为快照添加
.isRetained()
方法,并在开发中使用.retain()
时检查快照是否已释放。(#1546)
重大变更
- 原子效应
useGetRecoilValueInfo_UNSTABLE()
和Snapshot#getInfo_UNSTABLE()
始终报告节点type
。(#1547)- 该 0.3 版本引入了对快照进行保留以供将来使用的需求,但这主要是一个警告。现在,必须保留快照才能解析异步选择器。请参阅 此处 和 此处 的文档。未来的版本将进一步强制执行此操作,因为垃圾回收将被释放。