В хуке update
useMutation документация Apollo рекомендует использовать writeFragment
для получения внутренней ссылки на недавно добавленный объект. Я нахожу это странным, так как этот объект уже существует в кеше. Поэтому я протестировал его с помощью readFragment
и, конечно же, он работает хорошо. Есть ли предпочтение использовать writeFragment
вместо readFragment
в этом случае использования?
https://www.apollographql.com/docs/react/data/mutations/#making-all-other-cache-updates
const [addTodo] = useMutation(ADD_TODO, {
update(cache, { data: { addTodo } }) {
cache.modify({
fields: {
todos(existingTodos = []) {
const newTodoRef = cache.writeFragment({
data: addTodo,
fragment: gql`
fragment NewTodo on Todo {
id
type
}
`
});
return [...existingTodos, newTodoRef];
}
}
});
Выдержка с этой страницы:
С помощью cache.writeFragment получаем внутреннюю ссылку на добавленную задачу, затем сохраните эту ссылку в ROOT_QUERY.todos множество.
const [addComment] = useMutation(ADD_COMMENT, {
update(cache, { data: { addComment } }) {
cache.modify({
fields: {
comments(existingCommentRefs = [], { readField }) {
const newCommentRef = cache.writeFragment({
data: addComment,
fragment: gql`
fragment NewComment on Comment {
id
text
}
`
});
return [...existingCommentRefs, newCommentRef];
}
}
});
}
});
Выдержка с этой страницы:
комментарий уже был добавлен в кэш с помощью useMutation. Следовательно, cache.writeFragment возвращает ссылку на существующий объект.
Я также разместил этот вопрос на доске обсуждений Apollo Client (https://github.com/apollographql/apollo-client/discussions/7515), но не получил там ответа.
Преимущество использования writeFragment
вместо readFragment
при извлечении элемента из кеша объясняется здесь (отрывок из https://www.apollographql.com/docs/react/caching/cache-interaction/#example-updating-the-cache- после мутации):
Если вы вызываете writeFragment с объектом options.data, который кэш может идентифицировать на основе его полей __typename и первичного ключа, вы можете избежать передачи options.id в writeFragment.
Независимо от того, предоставляете ли вы options.id явно или позволяете writeFragment выяснить это с помощью options.data, writeFragment возвращает ссылку на идентифицированный объект.
Такое поведение делает writeFragment хорошим инструментом для получения ссылки на существующий объект в кеше, который может пригодиться. при написании функции обновления для useMutation
Это противоречит здравому смыслу, так как название writeFragment
подразумевает, что оно предназначено для записи в кеш, а не для чтения из него, но, похоже, это рекомендуемая передовая практика.