GraphQL + Apollo + React: невозможно отобразить данные

Ниже приведен пример кода на стороне клиента, использующего клиент Apollo.

Я предоставляю данные с экспресс-сервера nodemon.

Мой запрос отлично работает в graphiQL.

GraphQL + Apollo + React: невозможно отобразить данные

import React from "react"
import { graphql } from 'react-apollo'
import gql from "graphql-tag";

const CounterpartyQuery = gql`
  query data{
        counterparty {
         name
       }
      }
`;

export class ExchangeRates extends React.Component {
   
    render() {
        console.info(this.props.data) // Giving undefined
        return (
            <div>hiii{this.props.data.counterparty.map(x => x.name)}</div>  //Error
        )
    }
}

const counterpartyData = graphql(CounterpartyQuery, { name: 'data' })(ExchangeRates)

export default counterpartyData
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
343
2

Ответы 2

Это происходит потому, что ваш сетевой вызов еще не завершен, но компонент отображается с использованием недоступной переменной.

Вам нужно использовать networkStatus, чтобы увидеть, закончился ли сетевой вызов, только тогда данные будут доступны для рендеринга. А пока нужно загрузчик показать.

Так что замените

graphql(CounterpartyQuery, { name: 'data' })

от

graphql(CounterpartyQuery, {
        name: 'data' ,
        props : ({data}) => {
            return {
                data,
                isLoading:data['networkStatus']==1 || data['networkStatus']==2 || data['networkStatus']==4
            }
        }
    }),

а затем используйте

this.props.isLoading

в методе рендеринга, чтобы решить, отображать ли загрузку или отображать список.

Например:

render() {
        console.info(this.props.data, this.props.isLoading)
        return (
            {this.props.isLoading ? <div>Loading Data</div>:<div>hiii{this.props.data.counterparty.map(x => x.name)}</div>
        }
    )
}

https://www.apollographql.com/docs/react/api/react-apollo.html#graphql-query-data-networkStatus

это зарезервированное ключевое слово в ошибке this.props.loading

AConsumer 10.04.2018 10:03

используйте connect для передачи реквизита.

Vraj Solanki 11.04.2018 10:36

Вы можете подробно объяснить, как в моем случае использовать connect to pass props?

AConsumer 11.04.2018 12:27

Клиент Apollo HOC передает опору loading для каждого из ваших запросов, она понадобится вам почти в каждом случае, чтобы дождаться ответа перед рендерингом ваших данных (вам также необходимо обрабатывать ошибки запроса):

export class ExchangeRates extends React.Component {

    render() {
        if (this.props.data.loading) {
            return <div> Loading </div>; // rendering an animated loading indicator here is good practice to show an activity
        }
        if (this.props.data.error) {
            return <div> Error </div>;
        }
        return (
            <div>hiii{this.props.data.counterparty.map(x => x.name)}</div>
        )
    }
}

После того, как вы сделали то, что вы сказали, я получаю следующее сообщение об ошибке: ---- TypeError: не удается прочитать свойство "загрузка" неопределенного значения.

AConsumer 10.04.2018 09:59

Я думаю, что наименование вашего запроса «данные» может вызвать некоторые проблемы, потому что это имя по умолчанию, попробуйте изменить имя запроса или просто не называйте его

Dyo 10.04.2018 10:07

Удалены данные имени как имя запроса, но по-прежнему появляется та же ошибка

AConsumer 10.04.2018 10:09

Ваш запрос работает на graphiQL? Есть разница с тем, что вы показываете, вы добавили «данные» после «запроса».

Dyo 10.04.2018 10:21

да, запрос работает нормально, тот, у кого нет данных, и с данными, оба дают одинаковые результаты как на сервере, так и на клиенте

AConsumer 10.04.2018 12:11

Попробуйте выполнить рендеринг console.info(this.props) и вернуть пустой <div />, чтобы увидеть, что вы получите.

Dyo 10.04.2018 12:20

Я получаю пустой объект

AConsumer 10.04.2018 12:23

Вероятно, проблема в вашем конфигурация apollo-client

Dyo 10.04.2018 12:26

Я обновил пакет, но все равно получаю ту же ошибку

AConsumer 10.04.2018 12:29

Вы выполнили следующие шаги по ссылке? Вы оборачиваете свое приложение <ApolloProvider client = {client}>?

Dyo 10.04.2018 12:32

Да, я сделал ... в документах apollo они используют компонент запроса, и это сработало и для меня, но если я использую HOC, я получаю сообщение об ошибке (как вы можете видеть)

AConsumer 10.04.2018 12:38

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