我正在从 ProductListing
组件发送一个 id
并且我在 中使用
组件。在 useParams
接收该 id
>ProductDetailProductDetail
组件中,我使用 find 方法查找对象,然后将其设置为 singleProduct
状态。刷新时我得到 singleProduct
is undefined.
导入
import React, { useState, useEffect } from "react";
import { NavLink, useParams } from "react-router-dom";
import Loading from "../other/Loading";
状态
const ProductDetail = () => {
const [loading, setLoading] = useState(false);
const [products, setProducts] = useState([]);
const [singleProduct, setSingleProduct] = useState({});
使用 useParams 接收 id
const { id } = useParams();
使用效果
useEffect(() => {
//GETTING PRODUCTS ARRAY
getProductListingData();
//FINDING A SINGLE OBJECT
getProductID();
}, []);
获取产品数组
const getProductListingData = async () => {
try {
const response = await fetch("http://localhost:8000/productListing");
const data = await response.json();
if (data) {
setLoading(false);
setProducts(data.products);
} else {
setProducts("PRODUCT LISTING DATA NOT FOUND");
}
} catch (error) {
console.log(error);
}
};
if (loading) {
return <Loading loadingProductListing="Loading Product List" />;
}
const getProductID = () => {
let foundProduct = {};
foundProduct = products.find((item) => {
return item.id === parseInt(id);
});
setSingleProduct(foundProduct);
};
// console.log("product ID = ", productID, typeof productID);
console.log("products = ", products);
console.log("singleproduct = ", singleProduct);
JSX
return (
<>
<div className="dvProducts col-12">
<div className="row">
<div className="col-12">
<NavLink
to="/product-listing"
className="text-dark mb-1 d-inline-block"
>
<i className="fa fa-angle-left f16"></i>
<span> Back</span>
</NavLink>
</div>
<div className="col-12 col-md-6 col-xl-4 mb-3">
<div className="border border-light shadow-sm p-1 h-100">
<div className="bg-light text-center p-5">
<a className="d-inline-block">
<img
src="images/description/coconut-water-200ml.png"
className="img-fluid"
alt="..."
/>
</a>
</div>
</div>
</div>
<div className="col-12 col-md-6 col-xl-8 d-flex mb-3 mb-xl-0">
<div className="m-md-auto">
<div>
<h4>Coconut Water</h4>
</div>
<div className="mb-2">
<i className="fa fa-star text-warning d-inline-block"></i>
<i className="fa fa-star text-warning d-inline-block"></i>
<i className="fa fa-star text-warning d-inline-block"></i>
<i className="fa fa-star-o text-warning d-inline-block"></i>
<i className="fa fa-star-o text-warning d-inline-block"></i>
</div>
<div className="mb-3">
<p>
Every athlete's go to natural energy drink; Coconut
Water is a complete win-win for your everyday
rehydration needs. #iaminlovewiththecoco!
</p>
</div>
<div className="d-flex mb-3">
<div className="mr-2">
<h6 className="d-inline-block mb-1">Size:</h6>
<span className="d-inline-block">200ml</span>
</div>
<div className="mr-2 ml-2">
<h6 className="d-inline-block mb-1">Category:</h6>
<span className="d-inline-block">Juices</span>
</div>
<div className="ml-2">
<h6 className="d-inline-block mb-1">Price:</h6>
<span className="d-inline-block">
<i className="fa fa-inr"></i>
<span className="d-inline-block">40.00</span>
</span>
</div>
</div>
<div>
<button
className="btn btnSecondary"
href="detail.html"
>
Add to Bag
</button>
</div>
</div>
</div>
</div>
</div>
</>
);
};
export default ProductDetail;
最佳答案
这是正常行为,根据规范,状态会在刷新时重置。如果你想保存它,你需要使用 localStorage/sessionStorage/cookies 等。
哪种方法最好?
嗯,我会说第二种方法更好。我会避免在本地存储中保留状态副本。我只会保留某种 token /id(在你的例子中是 uid),它唯一地标识用户并且每次都会获取新数据。当您的应用程序增长时,可能很难在本地存储中管理这些状态。
关于javascript - 在 React.js 中刷新时丢失 useState 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70832675/