#javascript #graphql #react-apollo #apollo-client #apollo-cache-inmemory
#javascript #graphql #реагировать-apollo #apollo-client #apollo-cache-inmemory
Вопрос:
У меня есть набор связанных элементов, например:
book {
id
...
related_entity {
id
...
}
}
который apollo кэширует как два отдельных объекта кэша, где related_entity
поле on book
является ссылкой на EntityNode
объект. Это нормально, данные связанной сущности также используются в другом месте вне контекста book
, поэтому они работают отдельно, и все выглядит хорошо и хорошо и обновляется, как и ожидалось … за исключением случая, когда связанная сущность не существует при начальной выборке (и, следовательно, ссылка на book
объект равна null) и я создаю его позже.
Я попытался добавить update
функцию в useMutation
хук, которая создает вышеупомянутое related_entity
в соответствии с их документацией: https://www.apollographql.com/docs/react/caching/cache-interaction/#example-adding-an-item-to-a-list вот так:
const [mutateEntity, _i] = useMutation(CREATE_OR_UPDATE_ENTITY,{
update(cache, {data}) {
cache.modify({
id: `BookNode:${bookId}`,
fields: {
relatedEntity(_i) {
const newEntityRef = cache.writeFragment({
fragment: gql`
fragment NewEntity on EntityNode {
id
...someOtherAttr
}`,
data: data.entityData
});
return newEntityRef;
}
}
})
}
});
но независимо от того, что я, кажется, пытаюсь, newEntityRef
всегда не определено, даже если новый EntityNode определенно находится в кэше и может быть прочитан просто отлично, используя тот же самый фрагмент. Я мог бы сдаться и просто принудительно выполнить повторную выборку объекта Book, но данные уже есть.
Я делаю что-то не так / есть ли лучший способ? За исключением этого, есть ли другой способ получить ссылку для кэшированного объекта, учитывая, что у вас есть его идентификатор?
Комментарии:
1. это объясняется в apollographql.com/docs/react/caching/cache-interaction /… ? более строго следуйте примеру кода (readField, возвращайте существующую ссылку и т. Д.)
2. Сам вопрос уже ссылается на этот точный документ, и код довольно точно соответствует коду примера.
Ответ №1:
Похоже, что на самом деле это проблема apollo-cache-persist
— я удалил ее, и приведенный выше код функционирует, как и ожидалось, в соответствии с документами. Также похоже, что я мог бы вместо этого обновиться до новой версии под другим именем пакета apollo3-cache-persist
, но в итоге мне все равно не понадобилось сохранение кэша.