我从内部 API 中提取数据,该 API 返回我试图显示的图像。我有一个页面功能,设置为显示来自该响应的信息。单个 bottle
{
"data":{
"id":"cc134653-c463-4e79-8b9e-f52dfe02498e",
"type":"bottle",
"attributes":{
"name":"Luc Belaire Rare Luxe",
"price":"$29.99",
"image":"https://cdn11.bigcommerce.com/s-7a906/images/stencil/1000x1000/products/10929/10518/Luc-Belaire-Rare-Luxe__73902.1555086630.jpg?c=2",
"sku":"813497005010",
"size":"750ML",
"origination":"France",
"varietal":"Sparkling Wine"
}
}
}
我是 React 的新手,所以我可能在这里弄错了,但是这个函数旨在显示一个加载器,只是一个简单的 fontawesome spinner,直到数据可用。
这是函数
import React, { useState, useEffect } from 'react';
import { Loader } from '../../components/Loader'
import { endpoints } from "../../utils/fetch";
export default function Bottle({ match }) {
let [bottle, setBottle] = useState([])
useEffect(() => {
fetch(`${endpoints().bottle}/${match.params.sku}`, { method: "GET" })
.then(response => response.json())
.then(data => setBottle(data.data))
}, [])
return (
!bottle ? <Loader /> :
<div className="card">
<div className="card-body">
<div className="row">
<div className="mb-4 mb-lg-0 col-lg-6">
<div>
<div className="position-relative h-sm-100 overflow-hidden">
<img className="img-fluid fit-cover w-sm-100 h-sm-100 rounded cursor-pointer"
src={bottle.attributes.image}
alt={bottle.attributes.name}
height={200}
width={125} />
</div>
</div>
</div>
<div className="d-flex justify-content-between flex-column col-lg-6">
<div>
<h5>Apple iMac Pro (27-inch with Retina 5K Display, 3.0GHz 10-core Intel Xeon W, 1TB SSD)</h5>
<a className="fs--1 mb-2 d-block" href="#!">Computer & Accessories</a>
<h4 className="d-flex align-items-center"><span className="text-warning mr-2">$1199.50</span></h4>
<p className="fs--1 mb-1"><span>Shipping Cost: </span><strong>$50</strong></p>
<p className="fs--1">Stock: <strong className="text-success">Available</strong></p>
</div>
<div className="row">
<div className="col-auto">
<button type="button" className="border-300 mr-2 btn btn-outline-danger btn-sm">
<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="heart" className="svg-inline--fa fa-heart fa-w-16 mr-1" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="currentColor" d="M462.3 62.6C407.5 15.9 326 24.3 275.7 76.2L256 96.5l-19.7-20.3C186.1 24.3 104.5 15.9 49.7 62.6c-62.8 53.6-66.1 149.8-9.9 207.9l193.5 199.8c12.5 12.9 32.8 12.9 45.3 0l193.5-199.8c56.3-58.1 53-154.3-9.8-207.9z" />
</svg>
282
</button>
</div>
</div>
</div>
</div>
</div>
</div>
)
}
根据我所写的内容,我希望加载器会一直显示,直到 bottle
不为空。相反,我收到以下错误。
我在这里滥用状态吗?我曾尝试在此处使用 async
和 await
,但未能成功显示数据。只是同样的错误。
答案 0 :(得分:1)
bottle
的默认值是 []
,在 JavaScript 中,空数组仍然被认为是真实的,因此这将导致您的组件在数据加载完成之前遵循 else 路径。>
此外,当您渲染组件时,您无论如何都不会将数据用作数组。
将您的 useState 更改为:
let [bottle, setBottle] = useState();
这将为 undefined
提供默认值 bottle
,这意味着您的三元将正确运行。