если вы испытываете то же самое, пожалуйста, проверьте следующий список:
- go, чтобы проверить https://github.com/apollographql/apollo-client/pull/4543. Применение
freezeResults
& assumeImmutableResults
в ApolloClient
поможет обнаружить проблему. В моем случае проблема фактически возникает внутри родительского компонента, который я мутировал в объектах хранилища Apollo, а не в компоненте, вызывающем client.writeQuery
, что, на мой взгляд, обычно трудно заметить и другим.
const client = new ApolloClient({
link: ...,
cache: new InMemoryCache({
freezeResults: true, // new
}),
assumeImmutableResults: true, // new
});
Убедитесь, что вы изменяете данные неизменным образом. (т.е. объект хранилища Apollo не был изменен до конца обновления)
https://github.com/immerjs/immer определенно помогает сохранить ваши изменения в неизменном виде. Я использовал это, чтобы изменить мой вложенный объект, и он работает так хорошо. Попробуйте использовать
client
, возвращенный из
useMutation
, тогда вы получите
client.writeQuery
для обновления. Хотя я не уверен в этом, многие люди распространяют это сообщение, возможно, в некоторых случаях помогают.
import { useMutation } from '@apollo/react-hooks';
import produce from "immer";
const [mutate, { client }] = useMutation(MUTATION_GQL);
const submit = () => {
mutate({
variables: { inputs },
update: (store, { data: { response }) => {
// get existing cache returned from the query
const cache = store.readQuery({ query: QUERY_GQL, variables: { id } });
// manipulate the cache in immutable fashion
const data = produce(cache, draftCache => {
draftCache.title = "new title";
draftCache.approval = response;
});
// write the cache back to that query
// REMEMBER the variables inside writeQuery too!
client.writeQuery({
query: QUERY_GQL,
variables: { id },
data,
});
}
})
}
Попробуйте использовать
useQuery
для чтения данных из
ApolloClient
вместо
readQuery
, чтобы получить обновленный кеш из хранилища Аполлона