问题描述
在cache.modify()
期间,我想手动更新一些现有的缓存数据并将其返回。最初,这可行,并且新数据会在我的UI中更新。但是,在突变后的最终渲染期间,useQuery
再次返回旧数据。我可以看到我的merge
函数被调用,incoming
被旧数据填充,并且删除了我的更改。 useQuery
随后将返回该旧数据。结果是新数据将在屏幕上闪烁一会儿,然后在还原时消失。我认为merge
之后不应该运行modify
。
这似乎只有在cache.modify()
期间更改缓存中的现有数据时才会发生。如果我只是追加到existing
数组并返回,则不会再次调用merge
,它会按预期工作。
是在cache.modify
内部手动更改可接受的数据,还是我滥用此功能?我试图避免使用writeFragment / writeQuery,以使merge
函数无法运行。
这是一个更具体的例子。我有一个允许用户评论并回复这些评论的应用程序。当用户回复comment
时,我需要增加父级comment
replyCount
。
fragment Comment on Comment {
id,body,replyCount,replies {
id,body
}
}
cache.modify({
id: cache.identify(makeReference('ROOT_QUERY')),fields: {
getComments: (existing,{readField}) => {
// 1
const returnComments = {
...existing,};
if (parentCommentId) {
// 2
for (const [index,comment] of existing.comments.entries()) {
const commentId = readField('id',comment);
if (commentId === parentCommentId) {
// 3
const commentWithReply = {
...parentComment,replyCount: parentComment.replyCount + 1,};
// 4
returnComments.comments[index] = commentWithReply;
return returnComments;
}
}
}
// 5
returnComments.comments = [savedComment,...existing.comments];
return returnComments;
},},});
-
克隆当前评论
-
这是对现有
comment
的答复,在existing
中找到父注释 -
创建父注释的克隆并增加
replyCount
-
覆盖数组中的父项
comment
并将其返回 -
否则,这是顶级
comment
,只需添加comment
并返回
如果评论是答复,并且我修改了父replyCount
的{{1}},则在运行之后将调用comment
函数。如果我只是追加(没有对merge
数据进行任何手动更新,则existing
无法运行。非常感谢您理解此处发生的一切!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)