在Apollo缓存修改时,如果需要删除缓存项字段,需要先生成DELETE哨兵对象,并将其返回。然后添加一个回调函数,当该哨兵对象被收到时,再执行实际的缓存删除操作。以下是示例代码:
// 生成DELETE哨兵对象
const DELETE_SENTINEL = Symbol('delete sentinel');
// 缓存修改函数
async function modifyCache(key, value) {
// 发送修改请求
const result = await apolloClient.mutate({
mutation: MODIFY_CACHE_MUTATION,
variables: {
key,
value,
delete: DELETE_SENTINEL // 将DELETE哨兵对象作为参数传递
},
});
// 返回DELETE哨兵对象
if (result.data.modifyCache === DELETE_SENTINEL) {
return DELETE_SENTINEL;
}
// 缓存修改成功,返回结果
return result.data.modifyCache;
}
// 注册DELETE哨兵对象的回调函数,执行实际的缓存删除操作
const cache = new InMemoryCache({
typePolicies: {
Query: {
fields: {
myField: {
// 注册DELETE哨兵对象的回调函数
merge(existing, incoming, { DELETE }) {
if (DELETE === DELETE_SENTINEL) {
// 删除缓存项字段
return undefined;
}
},
},
},
},
},
});