开发者问题收集

无法读取未定义的属性(读取“名称”)。thisProduct undefined

2021-11-16
820

我在读取 {find} 时遇到问题。 问题出在 ProductDetail.js 中。 首先,单击产品链接,然后单击任何产品以查看详细信息。 TypeError:无法读取 null 的属性(读取“find”) https://codesandbox.io/s/react-router-product-detail-pages-dynamic-links-forked-y1o0n?file=/src/ProductDetail.js:418-429

2个回答

您在 ProductDetail.js 文件中犯了一些错误。

第一:

您可以使用 useEffect 钩子来检查并比较是否存在 匹配的 id

第二:

您可以使用 useState 钩子来存储 thisProduct 并通过调用 setThisProduct 来更新 thisProduct 值并在 JSXElement 中使用它。

使用 state 来设置和获取数据始终是一种最佳实践。

Here is more about React.Hooks

第三:

Price 是一个对象,您不能像那样渲染对象,因此在渲染时使用键而不是对象。像这样: {thisProduct?.price?.current?.value

You can learn more about optional chaining

第四:

useParams 获取的 productId 是字符串类型,而 sneakers 获取的 productId 是数字类型。因此,在比较时,您需要将 productId 更改为数字,如下所示: Number(productId)

Learn about Numbers in Js

这是您的完整代码:

// ProductDetail.js
import React, { useContext, useEffect, useState } from "react";
import { useParams } from "react-router-dom";
import { StateContext } from "./GlobalContext";

function ProductDetail() {
  const { productId } = useParams();
  const { sneakers } = useContext(StateContext);
  const [thisProduct, setThisProduct] = useState({});

  useEffect(() => {
    if (sneakers) {
      const findProduct = sneakers.find((product) => {
        return product.id === Number(productId);
      });
      console.log("findproduct", findProduct);
      setThisProduct(findProduct);
    }
  }, [productId, sneakers]);

  return (
    <div>
      {thisProduct && (
        <>
          <h1>{thisProduct?.name}</h1>
          <p>Price: {thisProduct?.price?.current?.value}</p>
          <p>{thisProduct?.description}</p>
        </>
      )}
    </div>
  );
}

export default ProductDetail;

Pradip Dhakal
2021-11-16

彻底检查你的状态和道具,它没有向子组件提供有效数据

<StateContext.Provider value={{ sneakers }}>
      {console.log(sneakers, "== thisProduct")}
      {children}
  </StateContext.Provider>

控制台将显示你的数据,它为空,所以这就是问题所在

2021-11-16