Поддерживает ли Apollo Stack глобальную идентификацию объектов, как интерфейс узла Relay?

Я очень новичок как в Apollo Stack, так и в Relay. Я пытаюсь выбрать между ними, чтобы инвестировать свое время. Дочитав книгу Learning GraphQL and Relay, я обратился к Apollo, чтобы узнать, что он может предложить, но сейчас в Интернете не так много ресурсов.

У меня недавно возник этот вопрос, но я не могу найти ответ: поддерживает ли Apollo глобальную идентификацию объектов как Relay делает с интерфейсом узла? если нет, есть ли у него альтернативное решение для поддержки глобальной идентификации объектов?


person kkkkkkk    schedule 04.12.2016    source источник


Ответы (2)


Да!

В настоящее время это работает (версия 0.5 apollo-client) с функцией dataIdFromObject, которую принимает конструктор ApolloClient.

Если все узлы имеют поле id и они уникальны для всех узлов (например, в Graphcool мы генерируем уникальные идентификаторы с помощью эта библиотека):

import ApolloClient from 'apollo-client';

const client = new ApolloClient({
  dataIdFromObject: o => o.id
});

Вы должны обязательно включать поле id в каждый запрос, который вы хотите нормализовать.

Если ваши идентификаторы уникальны только для каждого типа, вы можете объединить их с __typename для создания уникальных идентификаторов:

const client = new ApolloClient({
  dataIdFromObject: (result) => {
    if (result.id && result.__typename) {
      return result.__typename + result.id;
    }

    // Make sure to return null if this object doesn't have an ID
    return null;
  },
});

Код взят из официальной документации Apollo.

person marktani    schedule 08.12.2016

В apollo-client v2 вместо этого необходимо передать экземпляр dataIdFromObject в экземпляр InMemoryCache.

import { InMemoryCache } from 'apollo-cache-inmemory';
import { HttpLink } from 'apollo-link-http';
import ApolloClient from 'apollo-client';

const client = new ApolloClient({
  link: new HttpLink(),
  cache: new InMemoryCache({
    dataIdFromObject: object => object.id,
  }),
});
person Chen-Tsu Lin    schedule 11.07.2018