#reactjs #fetch #crud #fetch-api
Вопрос:
Я создал это приложение React, чтобы практиковать API выборки. Однако при написании кода для отображения данных в браузере с помощью метода карты я получил сообщение об ошибке «Ошибка типа: профиль.карта не является функцией». Ниже приведен код:
import React, { Fragment, useEffect, useState } from "react";
import "./App.css";
function App() {
// https://reqres.in/api/users
const [profile, setProfile] = useState([]);
const [loading, setLoading] = useState(false);
const getProfile = async () => {
setLoading(true);
const response = await fetch("https://reqres.in/api/users");
const data = await response.json();
setProfile(data);
setLoading(false);
};
useEffect(() => {
getProfile();
}, []);
return (
<Fragment>
<h1>React fetch</h1>
<div className="main">
<section className="section">
<h2>Get database</h2>
<div>
{loading ? (
<Fragment>loading..</Fragment>
) : (
profile.map(i => {
<Fragment>
<ul>
<li>{i.id}</li>
<li>{i.email}</li>
<li>{i.first_name}</li>
<li>{i.last_name}</li>
<li>
<image src={i.avatar} />
</li>
</ul>
</Fragment>;
})
)}
</div>
</section>
<form className="section">
<h2>Post data</h2>
<input type="text" placeholder="enter detail" />
<button type="submit">Post</button>
</form>
<form className="section">
<h2>Update data</h2>
<select>
<option>Choose data</option>
</select>
<input type="text" placeholder="enter detail" />
<button type="submit">Update</button>
</form>
</div>
</Fragment>
);
}
export default App;
Почему карта не распознается?
Комментарии:
1. Потому
data
что insetProfile(data);
— это не массив. Если вы опубликуете ответdata
здесь в вопросе, я уверен, что вы его узнаете.2. @choz У меня есть только одна страница в этом проекте, и API от » reqres.in/api/users »
3. Внимательно ознакомьтесь с предоставленным вами URL-адресом. Это не массив.
Ответ №1:
Я считаю, что это потому, что .map-это метод для прототипов массивов, а не для объектов (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)
Вы можете вернуть массив из объекта, используя data.data вместо просто данных:
...
const getProfile = async () => {
setLoading(true);
const response = await fetch("https://reqres.in/api/users");
const data = await response.json();
setProfile(data.data); // probably a safer way to do this, but if you console.log(data) you'll see an object is being returned, not an array.
setLoading(false);
};
...
Ответ №2:
Карта должна возвращать значение.
{loading ? (
<Fragment>loading..</Fragment>
) : (
profile.map(i => {
return (
<Fragment>
<ul>
<li>{i.id}</li>
<li>{i.email}</li>
<li>{i.first_name}</li>
<li>{i.last_name}</li>
<li>
<image src={i.avatar} />
</li>
</ul>
</Fragment>;
)
})
)}
Кроме того, вы не можете использовать функцию map для объекта. Похоже, что ваш ответ-это объект, то, что вы ищете, — это данные из ответа. Попробуй это…
setProfile(data.data);
Комментарии:
1. это не имело никакого значения
Ответ №3:
Итак, const data = await response.json();
после выполнения этой строки результат, который мы получаем внутри константы данных, является объектом. Мы можем использовать функцию MAP только для массивов, а не для объектов. А также данные профиля, которые вы на самом деле ищете, находятся внутри ключа «данные» в разделе «константа данных». Поэтому при настройке данных профиля просто используйте setProfile(data.data);
.
A предложения: Используйте это расширение Chrome для просмотра данных API. Он автоматически делает отступы для объектов json