Кэш клиента Apollo не распознает отношения один к одному

У меня есть схема graphql с объектом places который имеет взаимно однозначные отношения с другим объектом placeDetails

Я обновил свой кеш Apollo после мутации, которая вставляет placeDetails для place. Я используюoptimisticResponse с моей мутацией, и все частично работает.

Проблема в том, что оптимистичный ответ ненадолго мигает на экране до того, как фактическая мутация вернется с сервера, который, кажется, перезаписывает любые ручные изменения, которые я внес в кеш в моем пользовательском updateфункция. Еще один запутанный момент заключается в том, что кеш apollo правильно связывает недавно вставленныеplaceDetails объект с правильным placesобъект, но обратная связь не создается в кэше. Я проверил кеш и увидел что-то вроде этого

placeDetails:ChIJq0HUUq6ipBIRWM6qGqALmok:
  places: {"__ref":"places:a60803b7-378d-4c6c-a41a-ada68f64a020"}

Но если я посмотрю на places:a60803b7-378d-4c6c-a41a-ada68f64a020 запись в кеше, для placeDetails.

Функция обновления и оптимистичный ответ

optimisticResponse: {
  __typename: "Mutation",
  placeDetails: {
    otherId: place.otherId, // From component calling the mutation
    name: name, // From component calling the mutation
    __typename: "placeDetails",
    places: {
      id: place.id, // From component calling the mutation
      __typename: "places"
    }
  }
},
update: (proxy, { data }) => {
  const id = `places:${place.id}`;
  const fragment = gql`
    id
    placeDetails {
      otherId
      name
      __typename
    }
    __typename
  `;
   const place: Place = proxy.readFragment<Place>({
      fragment,
      id
   })!;
   const updatedPlace: Place = {
       ...place,
       placeDetails: data.placeDetails
   };
   proxy.writeFragment({
     id,
     fragment,
     data: updatedPlace
   });
  }
}

Упрощенная мутация

mutation InsertPlaceDetails(
    $otherId: String!
    $name: String!
  ) {
    insert_placeDetails(
      objects: [
        {
          otherId: $otherId
          name: $name
        }
      ]
    ) {
      returning {
        otherId
        name
        __typename
        places {
          id
          __typename
        }
      }
    }
  }

Я немного упростил пример. otherId столбец на placeDetails это FK к столбцу на places. Я правильно настроил свой кеш для использования правильных идентификаторов черезdataIdFromObject вариант конфигурации.

Любая помощь будет принята с благодарностью! При необходимости я могу предоставить более подробную информацию

0 ответов

Другие вопросы по тегам