#javascript #arrays #reactjs #react-hooks
#javascript #массивы #reactjs #реагирующие перехваты
Вопрос:
Я пытаюсь создать простое приложение для отслеживания COVID, но после получения данных при использовании функции map я получаю следующую ошибку:
Error : TypeError:countryData.map is not a function
import React, { useState, useEffect } from 'react';
import { NativeSelect, FormControl } from '@material-ui/core';
export const CountriesData = () => {
const [countryData, setCountryData] = useState([]);
const [isLoaded, setLoading] = useState(false);
const url = 'https://covid19.mathdro.id/api/countries';
useEffect(() => {
async function DataOfCountry() {
const data2 = await fetch(url);
const MainData2 = await data2.json();
console.log(MainData2);
setCountryData(MainData2);
setLoading(true);
}
DataOfCountry();
}, [setCountryData]);
if (!isLoaded) {
return <div>Loading...</div>;
}
return (
<FormControl>
<NativeSelect>
<option value="global"> Global</option>
{countryData.map((country, i) => (
<option key={i} value={country}>
{country}{' '}
</option>
))}
</NativeSelect>
</FormControl>
);
};
Комментарии:
1. Вы проверили значение
MainData2
? Вероятно, это не массив, а объект.2. похоже, ваш базовый URL неверен, он должен быть ‘ covid19.mathdro.id/api » . Поскольку вы добавляете страны при вызове выборки.
3. Дорогой брат @Sam Url работает нормально. проблема с вызовом сопоставления
4. Дорогой брат @ZsoltMeszaros я внес небольшие изменения, и да, это не массив, а объект .. пожалуйста, помогите мне, как преобразовать объект в массив..
Ответ №1:
Это потому, что возвращаемые данные являются объектом, а не массивом. Вам не нужно его преобразовывать; свойство выбранных данных countries
представляет собой массив стран, поэтому вам нужно обновить свое состояние с помощью этого:
import React, { useState, useEffect } from 'react';
import { NativeSelect, FormControl } from '@material-ui/core';
export const CountriesData = () => {
const [countries, setCountries] = useState([]);
const [isLoaded, setLoading] = useState(false);
const url = 'https://covid19.mathdro.id/api/countries';
useEffect(() => {
async function fetchCountries() {
const response = await fetch(url);
const data = await response.json();
// you should handle errors!
setCountries(data.countries);
setLoading(true);
}
fetchCountries();
}, [setCountries]);
if (!isLoaded) {
return <div>Loading...</div>;
}
return (
<FormControl>
<NativeSelect>
<option value="global">Global</option>
{countries.map((country) => (
<option key={country.iso3} value={country.name}>
{country.name}
</option>
))}
</NativeSelect>
</FormControl>
);
};