如何从突变查询中更新 Apollo 数据存储/缓存,更新选项似乎没有触发

Posted

技术标签:

【中文标题】如何从突变查询中更新 Apollo 数据存储/缓存,更新选项似乎没有触发【英文标题】:How do I update the Apollo data store/cache from a mutation query, the update option doesn't seem to trigger 【发布时间】:2017-10-16 02:28:41 【问题描述】:

我的 React Native 应用程序中有一个高阶组件,用于检索配置文件。当我调用“添加追随者”突变时,我希望它更新个人资料以反映其追随者集合中的新追随者。如何手动触发对商店的更新。我可以重新获取整个配置文件对象,但更愿意只在没有网络重新获取的情况下进行插入客户端。目前,当我触发突变时,配置文件不会反映屏幕上的变化。

看起来我应该使用update 选项,但它似乎不适用于我命名的突变。 http://dev.apollodata.com/react/api-mutations.html#graphql-mutation-options-update

const getUserQuery = gql`
 query getUserQuery($userId:ID!) 
    User(id:$userId) 
      id
      username
      headline
      photo
      followers 
        id
        username
        thumbnail
      
    
 
`;
...

const followUserMutation = gql`
  mutation followUser($followingUserId: ID!, $followersUserId: ID!) 
    addToUserFollowing(followingUserId: $followingUserId, followersUserId: $followersUserId) 
      followersUser 
        id
        username
        thumbnail
      
    
  `;
...

@graphql(getUserQuery)
@graphql(followUserMutation,  name: 'follow' )
@graphql(unfollowUserMutation,  name: 'unfollow' )
export default class MyProfileScreen extends Component Profile

...

  this.props.follow(
    variables,
    update: (store,  data:  followersUser  ) => 
      //this update never seems to get called
      console.log('this never triggers here');
      const newData = store.readQuery( getUserQuery );
      newData.followers.push(followersUser);
      store.writeQuery( getUserQuery, newData );
    ,
  );

【问题讨论】:

【参考方案1】:

编辑:刚刚意识到您需要将更新添加到突变的 graphql 定义中。

编辑 2:@MonkeyBonkey 发现您必须在读取查询函数中添加变量

@graphql(getUserQuery)
@graphql(followUserMutation, 
  name: 'follow',
  options: 
    update: (store,  data:  followersUser  ) => 

       console.log('this never triggers here');
       const newData = store.readQuery(query:getUserQuery, variables);
       newData.followers.push(followersUser);
       store.writeQuery( getUserQuery, newData );
     
  ,
);
@graphql(unfollowUserMutation, 
  name: 'unfollow'
)
export default class MyProfileScreen extends Component Profile

  ...

  this.props.follow(
      variables:  .... ,
    );

我建议您使用updateQueries 功能link 更新商店。

例如看这个post

您可以使用compose 将突变添加到组件中。在突变内部,您不需要调用client.mutate。您只需在关注用户点击时调用突变。

也可以让 apollo 为您处理更新。如果您稍微更改突变响应,则将以下用户添加到被关注用户并添加 dataIdFromObject 功能。 link

【讨论】:

根据文档 - 它说 updateQueries 已被弃用并使用更新而不是dev.apollodata.com/react/cache-updates.html#updateQueries,我尝试使用更新选项,但它似乎没有触发更新 - 我将更新该代码的问题 sn-p 你有 console.log(newData).一件事,您可能必须为readQuery 命名查询才能找到它。 const getUserQuery = gql'query getUserQuery .... 我命名了 readquery - 但仍然没有触发更新功能 - 我 console.log 第一行但它没有被调用 - 我将使用 console.log 和你的更新问题为查询命名的建议 更新了我的答案。我认为您必须在 graphQL 定义中添加更新定义。也许它不是这样工作的,但它是要走的路 我在你的示例中的 graphql 定义中尝试过,但它似乎仍然没有触发,我使用的是 apollo-client 版本 1.2.2 和 react-apollo 1.2.0

以上是关于如何从突变查询中更新 Apollo 数据存储/缓存,更新选项似乎没有触发的主要内容,如果未能解决你的问题,请参考以下文章

变异后的Apollo缓存未更新

如何在突变之前更新 apollo 缓存状态,以进行 Like、Upvote 等操作? [关闭]

如何在多个视图中处理突变后的缓存更新?

在 Apollo 客户端上更新缓存

如何在突变后更新阿波罗缓存(使用过滤器查询)

Apollo / GraphQl - 单实体突变不更新缓存(数据库更新)