TypeError: .map is not a function - React application
TypeError: .map is not a function - React application
我创建了这个 React 应用程序来练习获取 API。
但是,在编写通过 map 方法在浏览器上显示数据的代码时,我收到错误消息“TypeError: profile.map is not a function”。下面是代码:
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;
为什么无法识别地图?
地图需要return一个值。
{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>;
)
})
)}
此外,您不能在对象上使用地图功能。看起来您的响应是一个对象,您要查找的是响应中的数据。试试这个...
setProfile(data.data);
我相信这是因为 .map 是数组原型的方法,而不是对象的方法 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)
您可以 return 通过使用 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);
};
...
因此,const data = await response.json();
执行此行后,我们在数据常量中获得的结果是一个对象。我们只能在数组上使用 MAP 函数,而不能在对象上使用。而且您实际搜索的配置文件数据位于数据“常量”的“数据”键内。所以在设置配置文件数据时,只需使用 setProfile(data.data);
.
一条建议:Use this Chrome Extension for viewing the API data. It indents the json objects automatically
我创建了这个 React 应用程序来练习获取 API。 但是,在编写通过 map 方法在浏览器上显示数据的代码时,我收到错误消息“TypeError: profile.map is not a function”。下面是代码:
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;
为什么无法识别地图?
地图需要return一个值。
{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>;
)
})
)}
此外,您不能在对象上使用地图功能。看起来您的响应是一个对象,您要查找的是响应中的数据。试试这个...
setProfile(data.data);
我相信这是因为 .map 是数组原型的方法,而不是对象的方法 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)
您可以 return 通过使用 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);
};
...
因此,const data = await response.json();
执行此行后,我们在数据常量中获得的结果是一个对象。我们只能在数组上使用 MAP 函数,而不能在对象上使用。而且您实际搜索的配置文件数据位于数据“常量”的“数据”键内。所以在设置配置文件数据时,只需使用 setProfile(data.data);
.
一条建议:Use this Chrome Extension for viewing the API data. It indents the json objects automatically