Apollo 可以从缓存中读取部分片段吗?
Can Apollo read partial fragments from cache?
我有一个简单的突变editPerson
。它更改了 and/or 对 id
.
指定人员的描述
我使用这个小片段从 React 组件调用 mutator:
function useEditPerson(variables) {
const gqlClient = useGQLClient();
const personFragment = gql`fragment useEditPerson__person on Person {
id
name
description
}`;
return useMutation(gql`
${personFragment}
mutation editPerson($id: ID!, $description: String, $name: String) {
editPerson(id: $id, description: $description, name: $name) {
...useEditPerson__person
}
}
`, {
variables,
optimisticResponse: vars => {
const person = gqlClient.readFragment({
id: vars.id,
fragment: personFragment,
});
return {
editPerson: {
__typename: "Person",
description: "",
name: "",
...person,
...vars,
},
};
},
});
}
除非指定人员的 name
或 description
尚未被查询且不存在于缓存中,否则此方法效果很好;在这种情况下 person
是 null
。这是 readFragment
的预期 - 任何不完整的片段都会这样做。
问题是我真的需要这些数据来避免不变错误 - 如果它们不在缓存中我完全可以使用空字符串作为默认值,这些值不会显示在 UI 无论如何。
有没有办法从缓存中读取部分片段?有没有更好的方法来获取乐观响应的数据?
我想您使用的代码段包含您需要的所有数据。所以,你可以通过参数将需要的数据传递给你的useEditPerson钩子,然后在乐观响应中使用,然后你就不需要使用gqlClient了。
我有一个简单的突变editPerson
。它更改了 and/or 对 id
.
我使用这个小片段从 React 组件调用 mutator:
function useEditPerson(variables) {
const gqlClient = useGQLClient();
const personFragment = gql`fragment useEditPerson__person on Person {
id
name
description
}`;
return useMutation(gql`
${personFragment}
mutation editPerson($id: ID!, $description: String, $name: String) {
editPerson(id: $id, description: $description, name: $name) {
...useEditPerson__person
}
}
`, {
variables,
optimisticResponse: vars => {
const person = gqlClient.readFragment({
id: vars.id,
fragment: personFragment,
});
return {
editPerson: {
__typename: "Person",
description: "",
name: "",
...person,
...vars,
},
};
},
});
}
除非指定人员的 name
或 description
尚未被查询且不存在于缓存中,否则此方法效果很好;在这种情况下 person
是 null
。这是 readFragment
的预期 - 任何不完整的片段都会这样做。
问题是我真的需要这些数据来避免不变错误 - 如果它们不在缓存中我完全可以使用空字符串作为默认值,这些值不会显示在 UI 无论如何。
有没有办法从缓存中读取部分片段?有没有更好的方法来获取乐观响应的数据?
我想您使用的代码段包含您需要的所有数据。所以,你可以通过参数将需要的数据传递给你的useEditPerson钩子,然后在乐观响应中使用,然后你就不需要使用gqlClient了。