跳至主要內容
版本:v18.0.0

類型安全更新器常見問題

一般

什麼是類型安全更新器?

類型安全更新器是一個專案的名稱,旨在為命令式更新 Relay 儲存區中的資料提供類型安全且符合人體工學的替代 API。

為什麼?

Relay 為提取和管理源自伺服器的資料提供了類型安全且符合人體工學的 API。此外,Relay 還提供了在客戶端模式擴展中定義僅限本機欄位的功能。但是,到目前為止,用於變更這些欄位中資料的 API 繁瑣且不符合人體工學,這表示我們無法推薦 Relay 作為管理本機狀態的解決方案。

現有的 API 有什麼問題?

先前的 API 繁瑣且不安全類型。它們很容易犯各種錯誤,並且要求開發人員僅在編寫更新器時才了解一組新的 API。

類型安全更新器是一組類型安全且(希望)更符合人體工學的 API。它們利用了廣為人知的 Relay 慣用語(查詢、片段、類型精煉),並使用 getter 和 setter,而不是要求開發人員了解一組在其他地方未使用的的方法。

開發人員如何使用類型安全更新器?

使用類型安全更新器,開發人員會編寫一個可更新的查詢或片段,其中指定要命令式更新的資料。然後,開發人員從儲存區中讀取該資料,傳回所謂的可更新 Proxy。然後,開發人員會變更該可更新 Proxy。使用 setter 變更該可更新 Proxy(例如,updatableData.name = "Godzilla")會呼叫舊的 API,但會增加類型安全性。

為什麼這些標示為 _EXPERIMENTAL

這些實際上並非實驗性。我們鼓勵您在編寫新程式碼時使用它們!此字尾將很快移除。

什麼是可更新的查詢或片段?

可更新的查詢或片段是具有 @updatable 指令的查詢或片段。

不會提取可更新的查詢和片段

在可更新的查詢和片段中選取的欄位是否從伺服器提取?

否!伺服器不知道可更新的查詢和片段。它們的欄位永遠不會被提取。

即使您在常規查詢或片段中散佈可更新的片段,該可更新片段所選取的欄位也不會作為該請求的一部分被提取。

如果我想提取一個欄位並變更它怎麼辦?

您應該在常規查詢/片段可更新的查詢/片段中都選取該欄位。

這會導致什麼後果?

  • 當您讀取可更新的資料時,如果儲存區中不存在該資料,則可能會遺失該資料。
  • 您無法在可更新的查詢/片段中散佈常規片段。
  • 可更新的查詢/片段產生的成品不包含查詢 ID,也不包含正規化 AST(用於將網路資料寫入儲存區)。
  • 諸如 @defer 等指令在此上下文中沒有意義,因此不允許使用。

其他

我從哪裡取得 store

類別 RelayRecordSourceSelectorProxyRelayRecordSourceProxy 包含方法 readUpdatableQueryreadUpdatableFragment。可以取得這些類別的執行個體

  • 在變更和訂閱的更新器中
  • 在變更的樂觀更新器中
  • 當使用 RelayModernEnvironmentcommitUpdateapplyUpdate 等方法時。
  • 當使用獨立的 commitLocalUpdate 方法時。