javascript - 为什么 setItem() 不给项目赋值?
问题描述
我一直无法显示项目的名称,因为它似乎是未定义的。虽然我使用 setItem() 将项目分配给项目状态属性,但如果我显示项目仍在控制台中,它是一个空对象。
function ItemDetail(props) {
useEffect(() => {
fetchItem();
}, []);
const [item, setItem] = useState({});
const fetchItem = async () => {
const fetchedItem = await fetch(
`https://fortniteapi.io/v1/items/get?id=${props.match.params.id}&lang=en`,
{
headers: {
Authorization: "79eab64a-7ec8a675-4d410f47-4a7304f4",
},
}
);
const itemn = await fetchedItem.json();
setItem(itemn);
console.log(item);
};
console.log(item.name);
return (
<div>
<h1>{item.name}</h1>
</div>
);
}
解决方案
console.log
我认为在调用和返回调用之前您的 fetch 尚未完成,item.name
导致undefined
.
你console.log
通常会在你setItem
完成状态设置之前触发,因为设置状态是一个异步操作。您console.log
显示一个空对象,因为您将状态初始化为一个空项目。console.log
因此,您的控制台会记录一个空对象,因为在调用之前状态尚未更改。
另一件事是,这也发生在您的返回函数中。因为返回是在组件的第一次执行时计算的,所以您的项目还没有被提取。它正在尝试访问item.name
,但是item
你得到的是一个空对象undefined
。您应该先检查 ifitem.name != undefined
然后返回 div。您可以使用三元运算符执行此操作,例如:
{item.name
? <div>
<h1>{item.name}</h1>
</div>
: <div><h1>Item has not loaded yet!</h1></div>}
item.name
在返回 div 之前进行检查。当 item 未定义时它给出 false,因为undefined 在 JavaScript 中被认为是错误的
或者,您可以通过 console.logging 查看 API 实际给出的响应itemn
。例如,您可能必须设置状态itemn.data
。itemn
但是如果没有看到日志就很难说。
推荐阅读
- python - 使用正则表达式将文本解析为熊猫,但产生了空数据框
- css - 我的盒子尺寸确定有哪些问题?
- kubernetes-helm - 在命名模板中使用父范围中定义的变量
- typescript - TypeScript - 传播类型只能从对象类型创建
- r - 如何使用非数字时间数据在 r 中绘制直方图?
- flutter - Flutter Applying font family from Theme in Main.dart 文件被应用。但是从自定义文件应用时相同,仅在应用栏上应用
- mysql - 在 nodejs 项目中构建 mySQL 代码的正确方法是什么?
- javascript - 箭头函数返回值说明
- r - 在 R 中循环和保存散点图
- flutter - 有没有办法让颤振应用程序自动运行?