跳到主要内容
版本:v18.0.0

填充缺失数据(缺失字段处理程序)

在上一节中,我们介绍了如何重用完全或部分缓存的数据,但是,在某些情况下,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) 相同的知识。

为此,我们可以向 RelayEnvironment 提供 missingFieldHandlers,它指定了此知识。

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 函数,以及它知道如何处理的缺失字段类型。您可能想要处理的两种主要类型的字段是
    • *'scalar'*:这表示包含标量值的字段,例如数字或字符串。
    • *'linked'*:这表示引用另一个对象的字段,即不是标量。
  • handle 函数接受缺失的字段、该字段所属的记录,以及在当前查询执行中传递给该字段的任何参数。
    • 在处理 *'scalar'* 字段时,handle 函数应返回一个标量值,以便用作缺失字段的值
    • 在处理 *'linked'* 字段时*,*handle 函数应返回一个 *ID*,引用存储中的另一个对象,该对象应作为缺失字段使用。**
  • 当 Relay 尝试从本地缓存中完成查询时,无论何时检测到任何缺失的数据,它都会在最终声明数据缺失之前运行任何与字段类型匹配的提供的缺失字段处理程序。

此页面是否有用?

通过以下操作帮助我们进一步改进网站 回答几个快速问题.