Как автоматически обновить кэш с мутацией, которая отвечает частичной ошибке - PullRequest
0 голосов
/ 24 сентября 2019

Как сделать Реагировать Аполлон автоматически обновляет кэш данными из ответа на мутацию, которая имеет частичные ошибки?

В Запрос я могу передатьопция errorPolicy: 'all', чтобы заставить это работать.Однако политика «all» и «ignore» не помогает в мутации, кэш не обновляется.

Версия:

apollo-client: 2.6.4
react-apollo: 3.1.1

Это первый запрос, который будет установленinfo:

fragment PurchasedCount on PurchasedCount {
  id
  purchased
}

query getSet {
  id
  limit
  purchasedCount { ...PurchasedCount }
}

После этого я использую мутацию для покупки набора:

fragment Purchase on Purchase {
  createdAt
}

mutation purchase {
  purchase {
    purchase { ...Purchase }
    purchasedCount { ...PurchasedCount }
  }
}

Если кто-то еще купил набор до лимита, ответ вернет ошибку превышения лимита.вместе с текущим приобретенным значением счетчика:

{
  data: {
    purchase: {
      purchasedCount: { id: 3, purchased: 10 },
      purchase: null
    }
  },
  errors: [{
    message: "limit_exceeded"
    ...
  }]
}

Я ожидал, что значение кэша для purchased будет автоматически обновлено до 10.Однако он обновляется только в том случае, если в ответах нет ошибок.Я должен вручную writeFragment в этом случае.

Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 24 сентября 2019

использовать обновление в мутации. То, что данные хотят обновить, состоит в том, чтобы считывать данные, найденные в кеше, с определенным запросом. Необходимость записи того, что вы хотите в кеш, с помощью writeQuery. Необходимость обновления данных выглядит на простом примере.

const GET_TODOS = gql`
  query GetTodos {
    todos
  }

`;

const ADD_TODO= gql`
  mutation ADD_TODO($id: String!, $type: String!) {
    addTodo(id: $id, type: $type) {
      id
      type
    }
  }
`;

const [addTodo] = useMutation(
    ADD_TODO,
    {

 update(cache, { data: { addTodo } }) {
        const { todos } = cache.readQuery({ query: GET_TODOS });
        cache.writeQuery({
          query: GET_TODOS,
          data: { todos: todos.concat([addTodo]) },
        });
      }
    }
...