Apollo GraphQl реагирует. Как очистить кеш запросов для всех комбинаций переменных?

Я использую apollo graphql в своем обработанном приложении. Скажем, у меня есть следующий запрос:

query ListQuery($filter: String!) {
   items(filter: $filter) {
     id
     name
   }
}

Этот запрос позволяет мне запрашивать список элементов, используя фильтр. Скажем, я использовал строку фильтра A, а затем использовал строку фильтра B. Кэш теперь будет содержать две записи: ListQuery (A) и ListQuery (B).

Теперь скажем, я использую мутацию для добавления нового элемента. Как удалить все кешированные запросы из кеша? Поэтому в этом случае я хочу удалить из кеша как ListQuery (A), так и ListQuery (B).

Как я могу это сделать?

Ответ 1

В вашем случае вы можете использовать метод apollo client.resetStore();

Он очистит предыдущий кеш, а затем загрузит активные запросы.

Ответ 2

Похоже, что вам нужно, refetchQueries опция refetchQueries/prop была установлена в массив строк имен запросов. В документации говорится, что:

Если options.refetchQueries - это массив строк, то Apollo Client будет искать любые запросы с теми же именами, что и предоставленные строки, и будет перевыпускать эти запросы с их текущими переменными.

Так что в качестве примера использования graphql HOC вы можете попробовать сделать:

function SomeComponent(props) {

  const performMutation = () => {
    props.doStuff({ refetchQueries: ["ListQuery"] })
      .then(/* ... */)
      .catch(/* ... */)
  }

  return (/* ... */)
}

export default graphql(DO_STUFF, { name: "doStuff" })(SomeComponent)

Или с компонентом Mutation:

function SomeComponent(props) {
  return (
    <Mutation
      mutation={DO_STUFF}
      refetchQueries={mutationResult => ["ListQuery"]}>
      {(doStuff, { loading, error }) => {
        /* ... */
      }}
    </Mutation>
  );
}

Если это как-то не делает то, что вам нужно, есть также обходной путь, использующий опцию update.

Надеюсь это поможет.

Ответ 3

Читайте о политиках выборки options.fetchPolicy

--Edit: -

Но это всего лишь хитрость, если вы хотите сбросить только один запрос. Чтобы сбросить все хранилище, смотрите ответ @Nitin: установите fetchPolicy только для сети. Обновить запрос. Верните его на ваш выбор.