填補遺失資料(遺失欄位處理器)
在前一節中,我們介紹了如何重複使用完全或部分快取的資料。然而,在某些情況下,Relay 無法自動判斷是否可以重複使用它已從其他查詢中取得的部分資料,以滿足特定查詢。具體而言,Relay 知道如何重複使用先前擷取的查詢的快取資料;也就是說,如果您擷取完全相同的查詢兩次,Relay 會知道第二次嘗試評估時,它已快取該查詢的資料。
但是,當使用不同的查詢時,可能仍會出現不同查詢指向相同資料的情況,而我們希望能夠重複使用該資料。例如,假設有以下兩個查詢
// Query 1
query UserQuery {
user(id: 4) {
name
}
}
// Query 2
query NodeQuery {
node(id: 4) {
... on User {
name
}
}
}
這兩個查詢不同,但參照完全相同的資料。理想情況下,如果其中一個查詢已經快取在儲存區中,我們應該能夠在渲染另一個查詢時重複使用該資料。但是,Relay 預設並不知道這一點,因此我們需要設定它,以編碼 `node(id: 4)` *「與」* `user(id: 4)` *「相同」*的知識。
為此,我們可以將 `missingFieldHandlers` 提供給 `RelayEnvironment`,其中指定了此知識。
const {ROOT_TYPE, Environment} = require('relay-runtime');
const missingFieldHandlers = [
{
handle(field, record, argValues): ?string {
// Make sure to add a handler for the node field
if (
record != null &&
record.getType() === ROOT_TYPE &&
field.name === 'node' &&
argValues.hasOwnProperty('id')
) {
return argValues.id
}
if (
record != null &&
record.getType() === ROOT_TYPE &&
field.name === 'user' &&
argValues.hasOwnProperty('id')
) {
// If field is user(id: $id), look up the record by the value of $id
return argValues.id;
}
if (
record != null &&
record.getType() === ROOT_TYPE &&
field.name === 'story' &&
argValues.hasOwnProperty('story_id')
) {
// If field is story(story_id: $story_id), look up the record by the
// value of $story_id.
return argValues.story_id;
}
return undefined;
},
kind: 'linked',
},
];
const environment = new Environment({/*...*/, missingFieldHandlers});
- `missingFieldHandlers` 是一個 *處理器* 陣列。每個處理器都必須指定一個 `handle` 函式,以及它知道如何處理的遺失欄位類型。您會想要處理的 2 種主要欄位類型是
- 「scalar」:這表示包含純量值的欄位,例如數字或字串。
- 「linked」:這表示參照另一個物件的欄位,即不是純量。
- `handle` 函式會取得遺失的欄位、該欄位所屬的記錄,以及在目前查詢執行中傳遞給該欄位的任何引數。
- 在處理 「scalar」 欄位時,handle 函式應傳回一個純量值,以用作遺失欄位的值。
- 在處理 「linked」 欄位時,handle 函式應傳回一個 ID,該 ID 參照儲存區中應取代遺失欄位的另一個物件。**
- 當 Relay 嘗試從本機快取滿足查詢時,只要偵測到任何遺失的資料,它就會在明確宣告資料遺失之前,執行任何與欄位類型相符的遺失欄位處理器。
這個頁面有幫助嗎?
請協助我們透過以下方式讓網站變得更好 回答幾個簡單的問題.