开发者问题收集

获取数组内的对象值时出现问题:TypeError:无法读取未定义的属性“name”

2020-11-06
143

可能我做错了什么,我对 React 还很陌生。所以,我只需要获取产品对象属性的值。

function Products() {

    const [products, setProducts] = useState([]);


    useEffect(() => {
        api.get('/product/list')
            .then(response => {
                setProducts((response.data))
            })
    }, [])


    return (
            <div className="main">
                  <div id="landings">
                   {console.log(products)}
                </div>
            </div>
    );
}

export default Products;

当我使用 console.log(products[0]) 时,我得到了这个:

Console

但是,如果我尝试获取对象的属性,如下所示: console.log(products[0].name)

我得到了错误

TypeError: Cannot read property 'name' of undefined

我做错了什么?

2个回答

首先,您需要了解 React Hooks 的工作原理。

出现此行为的原因是,当安装此组件时,由于您使用了 useState React Hook,因此 products 会使用值 [] 进行初始化,然后进行渲染。

直到那时

  • products 的值为 []
  • products[0] 的值未定义

这就是 console.log(products[0].name) 显示 “无法读取未定义的属性‘name’”

第一次渲染完成后, useEffect 钩子就会出现,因为它在这里提供 componentDidMount 的行为,并执行 API 调用以获取 products 数据并在响应后将其分配给产品来了。

您应始终确保您没有尝试从未定义的对象访问密钥

在这里,不要使用 console.log(products[0].name),而应使用 {products && products[0] && console.log(products[0].name)

这将防止您的代码中断。

为了更好地了解 React Hooks 的工作原理,请阅读以下内容: https://reactjs.org/docs/hooks-overview.html 由于您对 React 还很陌生,因此请从此处了解 React 的生命周期 https://reactjs.org/docs/state-and-lifecycle.html

希望您能明白。。 祝您编码愉快!!!!

Ratnesh Chandra
2020-11-06

最初您得到的是空数组,一旦获取数据,您就会收到非空数组 因此,您可以通过

return (
  <div className="main">
    {products.length && <div id="landings">{console.log(products)}</div>}
  </div>
);

return (
  <div className="main">
    <div id="landings">
      {products.map((product) => (
        <span key={product.id}>{product.name}</span>
      ))}
    </div>
  </div>
);
简单地隐藏此错误
Lashan Fernando
2020-11-06