Клиент Apollo (реагировать) - элемент во вложенном массиве повторяется - PullRequest
0 голосов
/ 17 июня 2020

У меня в проекте React установлен клиент GraphQL с использованием Apollo Boost. Это простая конфигурация, например:

import uuid from 'react-uuid';

import ApolloClient, { gql, InMemoryCache } from 'apollo-boost';

import { config } from '../configs/config';
import { sendNotification } from './ToastService';

const client = new ApolloClient({
  uri: config.url.API_URL,
  cache: new InMemoryCache({
    // eslint-disable-next-line no-underscore-dangle
    dataIdFromObject: (o): string | null => (o.id ? `${o.__typename}:${o.id}` : uuid()),
  }),
  onError: (({ graphQLErrors, networkError }): void => {
    if (graphQLErrors) {
      graphQLErrors.forEach(({ message }) => {
        sendNotification({ type: 'error', title: 'Error', subtitle: message });
      });
    }

    if (networkError) {
      sendNotification({ type: 'error', title: 'Error', subtitle: networkError.message });
    }
  }),
});

export class GraphQLClient<T> {
  async query(query: string): Promise<T> {
    return client.query({ query: gql`query { ${query} }` })
      .then((response) => response.data)
  }
}

Мой запрос похож на следующий, где todo_list и оба children являются массивами:

query {
  my_report {
    todo_list {
      id
      key
      value
      name
      children {
        id
        key
        value
        name
        children {
          id
          key
          value
          name
        }
      }
    }
  }
}

Раньше я был возникла проблема, когда элементы в моем todo_list.children были извлечены, все равны первому элементу. Атрибуты id и key во всех списках могут иметь значение NULL. Затем, проведя небольшое исследование, я нашел это исправление, которое я добавил в свой объект конфигурации ApolloClient:

dataIdFromObject: (o): string | null => (o.id ? `${o.__typename}:${o.id}` : uuid()),

Итак, либо todo_list, либо todo_lis.children приходят, как ожидалось (тот же результат, который я могу проверить график я ql). Но это исправление не работает на todo_lis.children.children по какой-то причине я не могу понять. Результаты для todo_lis.children.children приходят с повторением value, которые даже не являются частью массива (например, присутствуют в другом родственном массиве). И я проверил и протестировал вывод на графике i ql, и это то, что я ожидал.

Одна вещь, которая вызывает у меня подозрение, это то, что todo_list.children имеет все id и key как NULL (однако они идут с правильными значениями), но todo_list.children.children имеет все id s. с некоторым значением (которое является правильным выводом с сервера). Но я действительно не знаю, почему он не работает с функцией dataIdFromObject, поскольку я правильно устанавливаю id для всех объектов в массивах.

Я ценю любую помощь. Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...