开发者问题收集

为什么会出现 TypeError:无法读取未定义的属性‘0’?

2018-08-07
76

我正在从 woocommerce 中提取数据。

我已在 render() 中将其定义为: const product2 = this.state.products2;

现在我想在这个返回的对象中定位一个特定的值,如下所示: const defaultLace = product2.default_attributes[0].option

但是,上面的代码会呈现类型错误,但 const defaultLace = product.default_attributes; 不会呈现错误,并且在控制台中我可以通过这种方式看到类似的数据;

      default_attributes: [
        {
          id: 0,
          name: "Lace",
          option: "Closure"
        }
      ]

这里发生了什么,导致这个 const defaultLace = product2.default_attributes[0].option 呈现错误?

有什么帮助吗?

---编辑----

损坏的代码复制:XXXX

2个回答

products2 在请求完成之前最初是一个空数组,因此访问 products2.default_attributes 将给出 undefined ,并尝试访问 [0] 将导致错误。

您可以等待渲染,直到 products2 数组已填充数据。

示例

render() {
  const product2 = this.state.products2;

  if (product2.length === 0) {
    return null;
  }

  const productSize = product2[0].default_attributes[0].option;

  return (
    <div>
      <h1>{productSize}</h1>
    </div>
  );
}
Tholle
2018-08-07

此代码没有问题。

但是,当您从远程服务器检索数据时,您必须检查数据是否存在且在您的结构中。

当您使用

const defaultLace = product2.default_attributes[0].option

时,您必须检查数据为:

if(product2 && product2.default_attributes && Array.isArray(product2.default_attributes) && product2.default_attributes.length > 0) {
    const defaultLace = product2.default_attributes[0].option
} else {
   throw new Error('Bad data');
}
Aleš Dostál
2018-08-07