在 React 中映射对象数组时出现错误
我尝试从后端获取数据并在前端显示该数据。这是我编写的用于执行此任务的代码。
function ViewPost() {
const { id } = useParams();
console.log(id);
const [posts, setPosts] = useState({});
useEffect(()=>{
getOnePost();
}, []);
useEffect(()=>{
if (posts && posts.location) {
console.log(posts.location);
console.log(posts.location.longitude);
console.log(posts.location.latitude);
}
}, [posts]);
const getOnePost = async () => {
try {
const response = await axios.get(`/buyerGetOnePost/${id}`)
console.log(response);
const allPost=response.data.onePost;
setPosts(allPost);
} catch (error) {
console.error(`Error: ${error}`)
}
}
console.log(posts);
console.log(posts.wasteItemList);
return(
<div className="posts-b">
<div className="posts__container-b">
<h1>Post Details</h1>
<main className="grid-b">
{posts.wasteItemList.map((notes,index)=>(
<article>
<div className="text-b">
<h3>Post ID: {index+1}</h3>
<p>Waste Item: Polythene Roll</p>
<p>Quantity: 1 kg</p>
</div>
</article>
))}
</main>
</div>
</div>
);
}
export default ViewPost;
当我 console.log(posts) 时,它成功显示了帖子数据。wasteItemList 是一个数组,它有两个对象。
当我 console.log(posts.wasteItemList) 时,它也成功显示了两个对象数组。
但是当我尝试映射 wasteItemList 时,问题就出现了。我尝试使用此
posts.wasteItemList.map
进行映射。但我收到错误“TypeError:无法读取未定义的属性‘map’”。我该如何解决这个问题?
发生这种情况是因为数据不是立即可用的,因此在一段时间内
posts.wasteItemList
未定义。
无论何时访问
wasteItemList
,您都应该使用
posts && posts.wasteItemList && posts.wasteItemList.map(()=> *)
这为您提供了完全的安全性。
如果您使用的是 TypeScript 或节点版本 >= 14,那么您可以使用
可选链
。
posts?.wasteItemList?.map(()=>{})
这基本上是同一件事,只是在语法上更令人愉悦。
将此特定行
{posts.wasteItemList.map((notes,index)=>
更改为
{posts.wasteItemList && posts.wasteItemList.map((notes,index)=>
posts
的初始值为
{}code>,因此帖子上没有
wasteItemList
属性。
尝试访问
posts.wasteItemList
将返回
undefined
,并且您无法映射
undefined
。
尝试在
posts?.wasteItemList?.map
上使用
可选链接
return(
<div className="posts-b">
<div className="posts__container-b">
<h1>Post Details</h1>
<main className="grid-b">
{posts?.wasteItemList?.map((notes,index)=>(
<article>
<div className="text-b">
<h3>Post ID: {index+1}</h3>
<p>Waste Item: Polythene Roll</p>
<p>Quantity: 1 kg</p>
</div>
</article>
))}
</main>
</div>
</div>
);