更改cache.modify中的缓存数据是否安全?

问题描述

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;
    },},});
  1. 克隆当前评论

  2. 这是对现有comment的答复,在existing中找到父注释

  3. 创建父注释的克隆并增加replyCount

  4. 覆盖数组中的父项comment并将其返回

  5. 否则,这是顶级comment,只需添加comment并返回

如果评论是答复,并且我修改了父replyCount的{​​{1}},则在运行之后将调用comment函数。如果我只是追加(没有对merge数据进行任何手动更新,则existing无法运行。非常感谢您理解此处发生的一切!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)