Как нормализовать состояние в apollo-link-state? - PullRequest
0 голосов
/ 07 сентября 2018

Учитывая запрос, который возвращает ответ со многими уровнями, например, этот запрос на GitHub API GraphQL :

query {
  viewer {
    starredRepositories(first: 100) {
      edges {
        node {
          repositoryTopics(first: 100) {
            edges {
              node {
                id
                topic {
                  id
                  name
                }
              }
            }
          }
        }
      }
    }
  }
}

Как можно нормализовать темы и сохранить их в магазине, используя apollo-link-state?

{
  topics: [Topic]
}

В настоящее время мой магазин настроен следующим образом:

import { InMemoryCache } from 'apollo-cache-inmemory';
import { ApolloClient } from 'apollo-client';
import { ApolloLink } from 'apollo-link';
import { withClientState } from 'apollo-link-state';

const cache = new InMemoryCache();

const store = withClientState({
  cache,
  defaults: {
    topics: [],
  },
  resolvers: {},
  typeDefs: `
    type Topic {
      id: String!
      name: String!
    }

    type Query {
      topics: [Topic]
    }
  `,
});

const client = new ApolloClient({
  cache,
  links: ApolloLink.from([
    // Other links ... ,
    store,
    // Other links ... ,
  ]),
});

Проверка моего кэша показывает ROOT_QUERY:

{
  topics: { ... },
  viewer: User
    starredRepositories({"first":100}): StarredRepositoryConnection
      ...
}

А также все сущности , нормализованные на apollo-cache-inmemory.

1 Ответ

0 голосов
/ 07 сентября 2018

Насколько я понимаю, нормализация данных полностью выходит за рамки запросов или кэша Apollo. Вы захотите создать какую-нибудь вспомогательную функцию для выравнивания объекта по мере необходимости после его извлечения из кэша. В отличие от Redux нет промежуточного программного обеспечения, где действие может быть обработано и сохранено в кеше. По крайней мере, насколько мне известно. Я нашел graphql_normalizr , который может дать вам то, что вы хотите. Для меня я бы предпочел просто обернуть Query в компонент с помощью вспомогательной функции для запуска извлеченного объекта через нормализованную схему через normalizr https://github.com/paularmstrong/normalizr/issues/108 до его возвращения.

...