javascript - 在 React.js 中刷新时丢失 useState 值

标签 javascript reactjs react-router react-router-dom

我正在从 ProductListing 组件发送一个 id 并且我在 中使用 useParams 接收该 id >ProductDetail 组件。在 ProductDetail 组件中,我使用 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/

相关文章:

javascript - 按 child 的 child 对数组进行排序

javascript - 使用对象中定义的属性更改 CSS

javascript - 消除 CSS 中 vendor 前缀的脚本

javascript - React router v4 内页(javascript)

css - React-router 在刷新时不为嵌套页面加载 css

reactjs - 无法读取未定义的属性(读取 'path')

javascript - D3.js:圆形剪切路径不起作用?

reactjs - 为什么在reactjs中使用action.payload

reactjs - Jest 在测试运行完成后一秒钟没有退出

reactjs - 在 react redux 应用程序中手动导航时状态丢失