Apollo cache.readQuery возвращает копию? - PullRequest
0 голосов
/ 28 июня 2018

Я проходил мутацию doc , и мне было интересно, если cache.readQuery вернет копию?

Например:

const { todos } = cache.readQuery({ query: GET_TODOS });

// Should I copy it first or is it already copied?
// todos = Object.assign({}, todos)

todos.items.concat([addTodo])
cache.writeQuery({
          query: GET_TODOS,
          data: { todos: todos }
        });

1 Ответ

0 голосов
/ 02 июля 2018

readQuery не возвращает копию

Вы можете проверить это сейчас, прочитав, затем изменив, а затем снова прочитав запрос, чтобы увидеть, изменились ли результаты

const { todos } = cache.readQuery({ query: GET_TODOS });

todos[0].completed = null;

const data.todos = cache.readQuery({ query: GET_TODOS });

console.log(data.todos[0].completed) // true or false

Исходный код

Если мы посмотрим на исходный код, то увидим, что readQuery сводится к этой функции graphqlAnywhere

 const result = graphqlAnywhere(
    readStoreResolver,
    query,
    rootIdValue,
    context,
    variables,
    {
      fragmentMatcher: fragmentMatcherFunction,
      resultMapper,
    },
  );

  return {
    result,
    complete: !context.hasMissingField,
  };

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

https://github.com/apollographql/apollo-client/blob/master/packages/graphql-anywhere/src/graphql.ts

https://github.com/apollographql/apollo-client/blob/91f5116ce830151e6bedf92e10550c607984e11c/packages/apollo-cache-inmemory/src/readFromStore.ts#L175

...