reactjs - 在渲染组件之前获取项目
问题描述
我在下面有这样的代码,我的问题是如何在渲染组件之前获取产品?我的意思是在我的 Panel 组件中,我有一个 .map 函数,它显示错误“无法读取未定义的属性 'map'”,因为获取产品的速度不够快。
const Announcments = () => {
const [announcements, setAnnouncement] = useState([]);
useEffect(() => {
const getProducts = async () => {
const res = await fetch("http://localhost:8000/api/products", {
method: "GET",
});
const data = await res.json();
await setAnnouncement(data);
};
getProducts();
}, []);
return (
<div className="announcments">
<TopNav results={announcements.length} />
<Panel announcements={announcements} />
<div className="down-pages-list">
<PagesList />
</div>
</div>
);
};
.map 函数:
{announcements.results.map((announcement) => (
<SingleAnnoun
price={announcement.price}
title={announcement.name}
photo={getPhoto(announcement.images[0].file_name)}
/>
))}
解决方案
问题
这里的问题不是“产品获取速度不够快”,而是您的初始状态与您在初始渲染时尝试渲染的状态不匹配。即announcements
最初是一个空数组([]
),但您正在尝试映射announcements.results
显然未定义的映射。
解决方案
使用有效的初始状态,以便最初呈现某些内容。
const [announcements, setAnnouncement] = useState({ results: [] });
现在announcements.results
已定义且可映射。
当然,这也假设您的setAnnouncement(data);
状态更新也是正确的。即您的 JSON是一个具有数组属性data
的对象。results
顺便说一句,setAnnouncement
是一个同步函数,所以没有什么可做await
的。
推荐阅读
- javascript - 从用户输入或文本框打开 URL
- angular6 - ngModel 字段(单击、聚焦)的任何更改都会强制 ngTemplateOutlet 重新渲染
- php - PHP Curl 请求被阻止但在浏览器中有效
- python - 如何将每个索引中由制表符分隔的值的列表转换为字典python
- c# - c#错误不一致的可访问性:参数类型'HRDMSV1.User'比方法更难访问
- swift - 尝试访问 TabBar 时 IOS swift 致命错误 nil 异常
- vue.js - 在 vue.js 中触发事件时如何更改样式类
- perl - 在 perl 中解析 yaml --> 代码:YAML_LOAD_ERR_BAD_MAP_ELEMENT
- c++ - 强制转换 void** 并将第一个字节设置为 nullptr?
- c++ - C++ - 如果循环内的语句不能正常工作