Как обновить Apollo Cache с большим количеством активных запросов

У меня есть много активных запросов, хранящихся в моем кэше Apollo, например:

items(isPublished: true, orderBy: "name", filterByName: "")
items(isPublished: true, orderBy: "name", filterByName: "home")
items(isPublished: false, orderBy: "name", filterByName: "home")
items(isPublished: true, orderBy: "age", filterByName: "home")
...

и, соответственно, множество возможных переменные для одного и того же запроса (GET_ITEMS), со все большим количеством фильтров. Когда я хочу добавить, переместить или удалить элемент, я обновляю Apollo Cache с помощью свойства Обновить компонента Mutation, например:

import gql from "graphql-tag";
import { Mutation } from "react-apollo";

const ADD_ITEM = gql`
  mutation AddItem(...
`;

...

<Mutation mutation = {ADD_ITEM} variables = {...} update = {() => ...} />

Но если я хочу хорошо обновить все мои кешированные запросы... как мне это сделать? Должен ли я использовать cache.readQuery и cache.writeQuery внутри функции обновления для каждого запроса? Это было бы безумием для меня.

Я потерялся с этим. Заранее спасибо.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
0
456
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Пример использования с учетом мутации с именем AddItem и запросов с именем Items:

const cache = new InMemoryCache()
const link = new WatchedMutationLink(cache, {
  AddItem: {
    Items: ({ mutation, query }) => {
      const addedItem = mutation.result.data.addItem
      const items = query.result.items
      const items.push(addedItem)
      return {
         ...query.result,
        items,
      }
    }
  }
})

Обратите внимание, что вы можете проверить как запрос, так и мутацию, переданную функции, чтобы определить, что нужно изменить, если что-то нужно изменить. Ваш фактический код может отличаться в зависимости от того, как на самом деле выглядят ваши запросы, это пример. Дополнительные сведения см. в документации.

Спасибо Даниэль. Этот пакет является удивительным. Но я не знаю, достаточно ли поддержки для будущих и следующих версий Apollo. Буду пользоваться, но буду ждать возможных изменений

Jose Ramos 01.07.2019 08:53

Другие вопросы по теме