Как получить и установить ссылку для вновь кэшированного связанного объекта в Apollo client InMemoryCache?

#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 , но в итоге мне все равно не понадобилось сохранение кэша.