略過主要內容

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 提供了一組新的 Hook useTransition(),以便在等待新狀態準備好時,能控制在狀態轉換期間要呈現的內容。Recoil 應與這種方法相容,並提供與 React 狀態一致的檢視。不過,React 18 可能會回退發生並發更新,現在尚未正式支援根據外部儲存的狀態變更,發起轉換。React 團隊正在研究這項支援,但在這之前,我們已透過以下 Hooks 加入試驗支援。此 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>
);
}

新功能

重大變更

  • Atom 效果
    • 將選項從 effects_UNSTABLE 重新命名為 effects,因為介面已逐漸穩定下來。(#1520
    • Atom 效果 初始化優先於 <RecoilRoot initializeState={...}>。(#1509
  • useGetRecoilValueInfo_UNSTABLE()Snapshot#getInfo_UNSTABLE() 始終回傳節點 type。(#1547
  • 0.3 發行版提出必須留存 Snapshot 以便後續使用,但這充其量只是一個警告。現在,為了讓非同步的選擇器得以解析,必須留存 Snapshot。此處有文件說明 此處此處。後續版本會進一步強制執行這一點,因為垃圾收集功能已發行。

其他修正與最佳化

  • 減少 Snapshot 複製的開銷
    • 僅在 callback 實際使用時才會為 callback 複製目前的 Snapshot。(#1501
    • 快取 callback 的複製 Snapshot,除非有變更狀態。(#1533
  • 修正某些情況下的傳遞選擇器更新 (#1409)
  • 修正與非同步選擇器和多個儲存體有關的一些特殊情況 (#1568)
  • Atom 效果
    • 於 transaction 期間從 useRecoilTransaction_UNSTABLE()set() 初始化 atom 時,執行 atom 效果 (#1466#1569)
    • 由已發布的 Snapshot 初始化時,atom 效果會被清除。(#1511#1532
    • 於清除 atom 時,在 atom 效果中取消訂閱 onSet() 處理常式。(#1509
    • 當 atom 使用 <RecoilRoot initializeState={...} > 初始化時,呼叫 onSet() (#1519#1511
  • 在某些情況下,當組件使用不同的 atom/選擇器時,避免額外重新渲染。(#825
  • <RecoilRoot> 於初始渲染期間,僅呼叫 initializeState() 一次。(#1372
  • 延後運算並將延遲屬性的結果暫存在記憶體中,例如來自 useGetRecoilValueInfo()Snapshot#getInfo_UNSTABLE()。(#1548#1549