Необходимо ли использовать ‘writeFragment’ при обновлении кэша после мутации?

#graphql #apollo-client

#graphql #apollo-клиент

Вопрос:

Итак, я изучаю мутации из клиентских документов apollo и наткнулся на обновление клиентского кэша после выполнения мутации. Необходимо ли использовать writeFragment, как описано здесь:https://www.apollographql.com/docs/react/data/mutations/#making-all-other-cache-updates ?

Потому что я могу сделать то же самое, расширив существующий массив и добавив объект ‘addTodo’, возвращаемый функцией обновления (по крайней мере, так я делаю с redux)

мои функции обновления выглядят следующим образом:

 update(cache, { data: { addTodo } }) {
      cache.modify({
        fields: {
          todos(existingTodos = []) {
            return [...existingTodos, addTodo];
          }
        }
      });
    }
  

Я что-то здесь упускаю?

Комментарии:

1. необходимо по той же причине — обновить другие компоненты, зависящие от того же источника данных (результат запроса)

2. @xadm, да, я понимаю цель использования функции обновления. Мой вопрос был об использовании fragment вместо прямого распространения массива и добавления нового объекта, потому что это сработало так же хорошо 🙂

3. мутация кэша (подпункты / подсвойства) не всегда влияет на запись в кэше для всего запроса, компоненты не будут повторно отображаться… writeQuery/writeFragment для этого

4. Прошу прощения за любую путаницу, но они были повторно отрисованы без каких-либо проблем. Также в документации говорится, что кэш для целевого поля обновляется до любого возвращаемого значения, которое мы установили для модификатора. Пожалуйста, дайте мне знать, если это поможет поделиться примером кода на codesandbox, чтобы вы могли посмотреть.

5. Я верю, что это работает, это очень простой вариант использования… в более сложных случаях это может привести к сбою… просто запомните на будущее… если некоторые компоненты с запросами не отображаются повторно после мутаций, проверьте методы обновления кэша.

Ответ №1:

Как writeQuery и writeFragment , modify запускает обновление всех активных запросов, которые зависят от измененных полей (если вы не переопределите это поведение).

В отличие от writeQuery и writeFragment , modify обходит любые функции слияния, которые вы определили, что означает, что поля всегда перезаписываются точно указанными вами значениями.

Вы также можете добавлять новые поля с помощью writeFragment .

 client.writeFragment({
  id: '5',
  fragment: gql`
    fragment myTodo on Todo {
      completed
    }
  `,
  data: {
    completed: true,
  },
});
  

Ссылка: https://www.apollographql.com/docs/react/caching/cache-interaction/#cachemodify Ссылка: https://github.com/apollographql/apollo-client/issues/6922