跳至主要內容

動機

為了相容性和簡單性,最好使用 React 內建的狀態管理功能,而非外部的全球狀態。但 React 有某些限制

  • 元件狀態只能透過推送到共同祖先元素來共用,但這可能會包含一個巨大的樹狀結構,然後需要重新渲染。
  • Context 只能儲存單一值,無法儲存一組不確定值,而且每個值都有自己的使用者。
  • 這些限制都會很難將樹狀結構的上層 (狀態必須存在的位置) 從樹狀結構的下層 (狀態被使用的位置) 中進行程式碼拆分。

我們希望改善這一點,同時盡可能讓 API、語意和行為都像 React 一樣。

Recoil 定義了一個有向圖,與 React 樹狀結構正交,但此圖也是內在的,且與 React 樹狀結構相關聯。狀態變更會從此圖的根部 (我們稱之為「原子」) 流動,透過純粹函式 (我們稱之為「選擇器」),然後進入元件。透過此方法

  • 我們取得了一個免除樣板的 API,其共用狀態具有與 React 本地狀態相同的簡易取得/設定介面 (但必要時可以封裝有簡化器等)。
  • 我們有機會在平行模式和其他新的 React 功能可用時,與這些功能相容。
  • 狀態定義是增量且分布式的,讓程式碼拆分成為可能。
  • 狀態可以被衍生資料取代,而無需修改使用該狀態的元件。
  • 衍生資料可以在同步和非同步之間互相切換,而無需修改使用該資料的元件。
  • 我們可以將導覽列為一流概念來處理,甚至在連結中對狀態轉換進行編碼。
  • 可運用與過往相容的方式輕鬆保留整個應用程式狀態,讓保留的狀態得以因應應用程式的變更。