ApolloClient:服务器上更新后如何同步Apollo缓存?

时间:2019-04-22 08:29:39

标签: javascript reactjs react-apollo apollo-client

在服务器上更新后,我正在尝试同步apollo缓存。 我应该直接写入缓存还是只能重新获取更新的数据?

我实际上是在尝试仅刷新更新的数据,但仍然无法正常工作。

我有一个programs(title: String)查询,如果标题为空,则提取所有程序,请参见下面的代码:

class Programs extends React.Component {
  render() {
    const FIND_PROGRAMS = gql`query findPrograms($title: String) {
      programs(title: $title) {  id title description }
    }`

    return (
      // The query fetch all programs if title is empty
      <Query query={FIND_PROGRAMS} variables={{ title: '' }}> 
        {({ data, error, loading, refetch }) => {
          if (loading) return <span>Loading</span>
          if (error) return <span>{error.message}</span>

          return (
            <div>
              { data.programs.map(program => <ProgramSummary program={program} />)}

              <button
                onClick={() => axios
                  .patch('path/to/endpoint', payload)
                  .then(updatedProgram => {
                    // Should I update the cache myself with something like this ?
                    // client.writeData(...) 

                    // Or should I refetch only updated Program like this ?
                    refetch({ title: updatedProgram.title }) // Not working yet
                  })
                }
              >
                UpdateProgram
              </button>
            </div>
          )
        }}
      </Query>
    )
  }
}

我的refetch不起作用,我应该做错了什么。 请帮忙。

1 个答案:

答案 0 :(得分:0)

我认为无法正常运行的行为是由于您尝试通过GraphQL对象数组(这是查询返回并因此刷新)来更新特定对象(更新数据)的事实。我的意思是,您不要求某人更新某些东西,然后给他们一堆东西,而只是给您想要更新的特定物品。

我建议改为使用一种变异来进行更新,这样您将如文档所说自动刷新数据,这与我之前所说的差不多。

“ [[...]如果要更新单个项目,只要返回项目的ID和更新的属性,通常就不需要更新功能。” >

请参见https://www.apollographql.com/docs/react/essentials/mutations#update

希望我能帮到你。