Ваш вызов API возвращает обещание , что означает, что нет никакого массива для map
немедленно. Используйте Async / Await , чтобы дождаться завершения вызова API. Когда данные возвращаются из API, вы можете сохранить их в состоянии.
Этот пример кода отображает результаты. Когда выбор валюты изменяется, выполняется вызов API. Async / Await обрабатывает обещание и сохраняет результаты в состояние. Реагирует «реагирует», представляя результаты, как только состояние меняется.
API возвращает различный объект rates
для каждой валюты. Поскольку эти результаты непредсказуемы, Object.keys используется для доступа к имени и значению неизвестного объекта ответа. См. больше на Object.keys .
Вы используете деструктуризацию для доступа к this.state.currencies
, поэтому вы можете просто ссылаться на нее как currencies
в оставшейся части вашего компонента. Наконец, поскольку вы прикрепили событие handleChange
к тегу select
, кнопка не нужна.
import React, { Component } from "react";
import logo from "./logo.svg";
import "./App.css";
class App extends Component {
constructor() {
super();
this.state = {
currencies: []
};
}
handleChange = event => {
this.getData(event.target.value);
};
async getData(target) {
const url = `http://data.fixer.io/api/latest?access_key=ea263e28e82bbd478f20f7e2ef2b309f&symbols=${target}&format=1`;
console.log("the url is: " + url);
let data = await fetch(url).then(data => {
return data.json();
});
this.setState({ currencies: data });
}
render() {
const { currencies } = this.state;
console.log(this.state);
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<h1 className="App-title"> Welcome to DKK website </h1>
<div class="dropdown">
<select
id="select1"
name="currency"
value={this.state.selectValue}
onChange={this.handleChange}
>
<option value="EUR">-- Selecting: NILL --</option>
<option value="CAD">-- Selecting: CAD --</option>
<option value="SGD">-- Selecting: SGD --</option>
<option value="AFN">-- Selecting: AFN --</option>
</select>
</div>
{/* <button className="pressMe"> Set Button </button> */}
<br />
<ul>
<li>Base: {currencies.base}</li>
<li>Date: {currencies.date}</li>
<li>Timestamp: {currencies.timestamp}</li>
{/* Sometimes currencies.rates is undefined.
Use conditional rendering to prevent errors when there is no value */}
{currencies.rates && (
<li>
Rate for {Object.keys(currencies.rates)}:{" "}
{Object.values(currencies.rates)}
</li>
)}
</ul>
{/*
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
*/}
</header>
</div>
);
}
}
export default App;