#graphql #apollo #apollo-client
#graphql #apollo #apollo-client
Вопрос:
Предположим, у меня есть следующие типы GraphQL:
type User {
id: String!
posts: [Post!]!
}
type Post {
id: String!
text: String,
}
И вот мутация, которая возвращает обновленное сообщение:
mutation addNewPost(
$userId: String!
$text: String!
) {
addNewPost(userId: $userId, text: $text) {
id
text
}
}
После запуска этой мутации мой кеш содержит новую запись сообщения. Как мне добавить его в массив сообщений пользователя? Я пробовал кешировать.writeQuery и cache.modify, но я не могу понять это.
Комментарии:
1. обновление после мутации описано в документах
Ответ №1:
Мы помещаем элемент в массив внутри функции обновления, которая является одним из вариантов изменения использования. Я пишу всю мутацию целиком, чтобы вы могли понять идею 💡, давайте посмотрим на пример:
С помощью функции обновления:
const [createPost, { data, loading, error }] = useMutation(CREATE_POST, {
update(cache, response) {
// Here we write the update
// Step 1: Read/Fetch the data 👈
const data = client.readQuery({
query: FETCH_POSTS_QUERY,
});
// Step 2: Update the cache by immutable way 👈
client.writeQuery({
query: FETCH_POSTS_QUERY,
data: {
getPosts: [response.data.createPost, ...data.getPosts],
},
});
},
variables: formValues,
});
Путем повторных запросов:
Это действительно быстрый способ обновить кеш, используя объект DocumentNode, анализируемый с помощью функции gql
const [createPost, { data, loading, error }] = useMutation(CREATE_POST, {
refetchQueries: [ 👈
FETCH_POSTS_QUERY
'fetchPosts`' // OR Query name
],
variables: formValues,
});
Комментарии:
1. Хороший ответ 🙂 заслуживает принятия.
Ответ №2:
Вы захотите выполнить прямую запись в кеш Apollo, чтобы обновить другие объекты, измененные вашей мутацией.
Взгляните на документы https://www.apollographql.com/docs/react/data/mutations/#making-all-other-cache-updates здесь для уточнения деталей (вы захотите использовать cache.modify
и cache.writeFragment
)