У меня есть много активных запросов, хранящихся в моем кэше 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 внутри функции обновления для каждого запроса? Это было бы безумием для меня.
Я потерялся с этим. Заранее спасибо.





Это одно из неприятных ограничений 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. Буду пользоваться, но буду ждать возможных изменений