【发布时间】:2021-08-30 22:08:16
【问题描述】:
当第一次使用 API 请求加载页面时,它会出错。但是在页面加载后,如果我放回相同的代码,它就可以正常工作。有人可以帮助我在这里缺少什么。或者告诉我延迟页面加载直到从 api 加载数据的技巧
import React, { useState, useEffect } from 'react'
export default function ProductPage({ data }) {
const [productData, setProductData] = useState(null)
useEffect(() => {
getProductdata()
}, [])
async function getProductdata(){
const secret = "SECRET"
const request = await fetch(`https://app.myapi.com/api/products/${data.productsCsv.id}`, {
headers: {
'Authorization': `Basic ${btoa(secret)}`,
'Accept': 'application/json'
}
}).then((request => request.json()))
.then(data => setProductData(data))
.catch(err=>console.log(err))
}
console.log("pdata",productData) // returns null on initial load and then it filled with data.
return (
<>
<div className="stock mb-4 ">
<p className="tracking-wider mb-2">Size</p>
{productData.variants.map((variant,index)=>{
<p>{variant.stock}</p>
if(variant.stock != 0){
return (
<button className={`p-2 border-gray-200 border mr-2 mb-2 hover:bg-black hover:text-white cursor-pointer focus:border-black ${activeSize === index ? 'bg-black text-white' : null}`} role="button" tabIndex={0}
onClick={() => {toggleSize(index); setSize(size)}}
onKeyDown={() => {toggleSize(index); setSize(size)}} key={index}>{variant.variation[0].option}-{variant.stock}</button>
)
}
else {
return(
<button className={`p-2 border-gray-200 border mr-2 mb-2 ${variant.stock == 0 ?'bg-gray-400 line-through text-red-500': null}`} disabled role="button" tabIndex={0}
onClick={() => {toggleSize(index); setSize(size)}}
onKeyDown={() => {toggleSize(index); setSize(size)}} key={index}>{variant.variation[0].option}-{variant.stock}</button>
)
}
})}
</div>
</>
)
【问题讨论】:
-
通过`.catch(getProductdata)`重试请求
-
但是您的
productData是最初是null,并且将在任何后续渲染中出现,直到被 GET 请求更新。您还将控制台日志记录为无意的副作用,因此您看到实际记录的内容不应该是对任何事情的真正衡量标准。你期望发生什么? -
所以我的代码在“productData.variants”循环中出错,说无法读取 null 的属性。因此,如果我从 return 语句中删除代码并刷新我的页面,错误就消失了,当我在 return 语句中添加相同的代码时,它工作正常,因为 productData 不再为 null
标签: javascript reactjs api fetch