Объект, вызывающий эту ошибку, - this.state
, где вы отображаете его в теге p
в конце вашего компонента.
Как уже упоминалось в верхнем ответе на на этот вопрос , единственными приемлемыми дочерними элементами React являются JavaScript Примитивы , например, строки и числа. Для рендеринга изменчивых вещей, таких как объекты и массивы, вы должны дать React некоторые инструкции о том, как отображать их в терминах примитивов, например, что делать с каждым элементом в массиве или какие ключи в объекте помещать на страницу.
У вас правильная идея рендеринга массива путем сопоставления ранее в компоненте:
{this.state.exRates.map(rate => {
return <div>{rate.toString()}</div>
})}
Это отрендерит все в exRates
, что, похоже, все, что у вас есть в this.state
. Если вы хотите проверить фактический объект this.state
, попробуйте поместить console.log(this.state)
в свой метод рендеринга, но за пределами return
.
Стоит также отметить, что console.log('return started')
собирается поместить этот текст в текст страница.
РЕДАКТИРОВАТЬ: Вот как вы можете использовать Object.entries
, чтобы получить то, что вам кажется здесь. Как только вы получите нужные данные во втором .then
в getCurrencyRatesFromDB
, вместо того, чтобы делать this.setState({exRates: data.rates});
, я бы порекомендовал сделать this.setState({exRates: Object.entries(data.rates)});
Таким образом, у вас будет массив массивов, который представляет данные из вашего объекта. например, если у вас было {usd: 10, eur: 12, gbp: 15}
в data.rates
, вы получите [[usd, 10], [eur, 12], [gbp, 15]]
в state.exRates
.
Затем, в вашем методе render
, вы можете сделать следующий код для рендеринга этой информации в вашем компоненте:
{this.state.exRates.map(([currency, rate]) => <div>{`${currency}: ${rate}`}</div>)
Это даст вам HTML, который выглядит примерно так:
<div>usd: 10</div>
<div>eur: 12</div>
<div>gbp: 15</div>
Отрегулируйте капитализацию при необходимости.
Если часть ...([currency, rate]) => ...
вас бросила, это Разрушение массива , и это очень полезная функция современного JavaScript.