Как обрабатывать обновления кеша Apollo для запросов с несколькими аргументами (например, табличных данных)

Краткий обзор моей проблемы

У меня есть запрос getTracks, который извлекает данные трека и принимает несколько аргументов для сортировки/фильтрации (лимит, смещение, поиск, сортировка, порядок). К сожалению, Apollo кэширует все это по отдельности, поэтому, когда элемент удаляется в одном представлении, пользователь меняет порядок сортировки, а удаленный элемент остается там (поскольку он находится в кеше для другого набора аргументов).

Подробности

Это запрос getTracks вместе с соответствующим типом ввода (в моей схеме AppSync на стороне сервера):

input SelectOptions {
  limit: Int
  offset: Int
  sort: String
  order: String
  search: String
}

type Query {
  getTracks(options: SelectOptions): TrackList!
}

type TrackList {
  total: Int!
  items: [Track!]!
}

В клиенте Vue запрос выглядит так:

query GetTracks($options: SelectOptions) {
  getTracks(options: $options) {
    total
    items {
      id
      name
      runtime
      createdAt
      metadata {
        trackNum
        trackName
        artistName
        albumName
        year
      }
    }
  }
}

При первом отображении таблицы элементы загружаются и отображаются нормально (порядок сортировки по умолчанию создается At/desc). Если я сортирую по createdAt/asc, выполняется сетевой запрос для получения результатов, и они отображаются нормально. Теперь, если я удалю одну из записей, а затем снова отсортирую по createdAt/desc, удаленный элемент будет показан, поскольку он извлекает его из кеша.

Нет ли в Аполлоне способа разумно пройти и удалить (или добавить/изменить) элементы из кеша, даже если запрос имеет разные аргументы? Я попробовал директиву @connectionкак описано здесь, но она просто сделала так, что сортировка таблицы не имела никакого эффекта (она вообще не загружалась с сервера).

Я полностью застрял и готов просто полностью отключить кеширование, потому что оно, похоже, не работает в реальных сценариях. Как я могу сохранить политику cache-and-network по умолчанию, но заставить мои таблицы вести себя правильно при изменении данных?

Если вы используете cache.modfiy в опции update мутации, она вызовет вашу функцию обратного вызова для всех вариантов аргументов, кэшированных для этого поля, что позволит вам удалить неопубликованную статью из любого из них.

Bergi 18.03.2021 01:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
1 409
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

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

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

new WatchedMutationLink(
  cache,
  {
    SaveTodo: {
      TodoList: ({ mutation, query }) => {
        // update logic here
      }
    }
  }
)

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

Спасибо! К сожалению, я нашел apollo-link-watched-mutation слишком сложным, на мой вкус, поэтому я просто написал свою собственную утилиту кэширования, которая отлично работает.

ffxsam 28.02.2019 16:03

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