Ниже приведен пример кода на стороне клиента, использующего клиент Apollo.
Я предоставляю данные с экспресс-сервера nodemon.
Мой запрос отлично работает в graphiQL.
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




Это происходит потому, что ваш сетевой вызов еще не завершен, но компонент отображается с использованием недоступной переменной.
Вам нужно использовать 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
используйте connect для передачи реквизита.
Вы можете подробно объяснить, как в моем случае использовать connect to pass props?
Клиент 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: не удается прочитать свойство "загрузка" неопределенного значения.
Я думаю, что наименование вашего запроса «данные» может вызвать некоторые проблемы, потому что это имя по умолчанию, попробуйте изменить имя запроса или просто не называйте его
Удалены данные имени как имя запроса, но по-прежнему появляется та же ошибка
Ваш запрос работает на graphiQL? Есть разница с тем, что вы показываете, вы добавили «данные» после «запроса».
да, запрос работает нормально, тот, у кого нет данных, и с данными, оба дают одинаковые результаты как на сервере, так и на клиенте
Попробуйте выполнить рендеринг console.info(this.props) и вернуть пустой <div />, чтобы увидеть, что вы получите.
Я получаю пустой объект
Вероятно, проблема в вашем конфигурация apollo-client
Я обновил пакет, но все равно получаю ту же ошибку
Вы выполнили следующие шаги по ссылке? Вы оборачиваете свое приложение <ApolloProvider client = {client}>?
Да, я сделал ... в документах apollo они используют компонент запроса, и это сработало и для меня, но если я использую HOC, я получаю сообщение об ошибке (как вы можете видеть)
это зарезервированное ключевое слово в ошибке this.props.loading