在改变列表过滤器时更新Apollo存储

时间:2017-05-28 10:51:47

标签: javascript graphql apollo react-apollo

我有一个如下所示的graphql架构:

type User {
    entries(status: EntryStatus): [Entry]
}

type Mutation {    
    updateEntry(status: EntryStatus): Entry
}

我可以按状态(这是一个枚举)过滤条目列表,我可以更新条目的状态。我想在状态更新时更新商店,以便条目显示在右侧列表中(entries(status: FOO)entries(status: BAR))。

我知道我可以使用update方法更新商店。

const withMutation = graphql(updateEntryMutation, {
  props: ({ mutate }) => ({
    updateEntry: updateEntryInput =>
      mutate({
        variables: { updateEntryInput },
        update: (proxy, newData) => {

          // update data here
          // Which would involve removing the entry from its previous filtered "list", and adding it to the one with the new status

      })
  })
});

但是我怎么知道从哪个列表中删除条目,因为我无法访问update中的旧数据(之前的entry.status)?

(除了按状态枚举所有列表,如果找到它,删除更新的条目......)

1 个答案:

答案 0 :(得分:0)

首先需要store.readQuery(),然后将新数据写入商店。

有点像这样:

const EntriesQuery = 'yourQueryHere';

const withMutation = graphql(updateEntryMutation, {
  props: ({ mutate }) => ({
    updateEntry: updateEntryInput =>
      mutate({
        variables: { updateEntryInput },
        update: (store, { data: { updateEntry }}) => {

          const data = store.readQuery({ query: EntriesQuery });
          data.entries.push(updateEntry)

          store.writeQuery({ query: EntriesQuery, data })
      })
  })
});