類型安全更新器常見問題
一般
什麼是類型安全更新器?
類型安全更新器是一個專案的名稱,旨在為命令式更新 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
?
類別 RelayRecordSourceSelectorProxy
和 RelayRecordSourceProxy
包含方法 readUpdatableQuery
和 readUpdatableFragment
。可以取得這些類別的執行個體
- 在變更和訂閱的更新器中
- 在變更的樂觀更新器中
- 當使用
RelayModernEnvironment
的commitUpdate
、applyUpdate
等方法時。 - 當使用獨立的
commitLocalUpdate
方法時。