【问题标题】:React Uncaught TypeError: Cannot read property [property_name] of undefinedReact Uncaught TypeError:无法读取未定义的属性[property_name]
【发布时间】:2016-12-23 11:28:24
【问题描述】:

我正在从父组件<CampersList _data={this.state.data}/> 传递一个属性,帮助我理解,我应该如何获取属性_data[0].updated.$t。 目前它返回给我一个错误:
下面是子组件的代码:

class CampersList extends React.Component {
constructor(props) {
    super(props);
}

render() {
    let campersNodes = this.props._data.map((element, index) => {
        return (
            <Camper user={element} index={index} key={index}/>

        );
    });
    let updateDate = this.props._data[0].updated.$t;
    return (
        <div>
            <table>
                <tbody>
                {campersNodes}
                </tbody>
            </table>
            <p>{updateDate}</p>
        </div>
    )
  }
}

但是如果我将let updateDate = this.props._data[0].updated.$t; 减少到
let updateDate = this.props._data[0]; 那么它会抛出不同的错误:

【问题讨论】:

  • 检查 this.props._data 是什么。
  • @dfsq this.props._data 是一个对象数组
  • 你能显示一些_data的样本数据吗??
  • 有可能您的“_data”在某些时候为空,因此访问索引 0 处的元素会导致 undefined

标签: reactjs ecmascript-6


【解决方案1】:

此错误表示 data[0] 未定义。

简单来说,react 需要几毫秒来更新它的 props,直到它们未定义。所以最初是data[0] is undefined

解决方案 1:要解决此问题,请尝试将它们置于 if 条件中。

if(this.props._data[0]) {
  //code
}

解决方案 2:使用getDefaultProps,它提供默认道具。 react推荐这个解决方案

getDefaultProps() {
  return {
     _data: []
  };
}

【讨论】:

  • 我在我的问题中添加了更多信息,也许它会澄清问题
  • @TarasYaremkiv 我对你想用this.props._data[0].updated.$t 实现的目标感到困惑。你想访问更新的数组还是它有一些名称更新的属性?这是什么$t 因为据我所知,反应没有像 $ 这样的东西来访问变量/数组/对象
  • 不,只要您将正确的道具传递给组件,这是不可能的。很可能问题出在$。我无法得到 $ 在 reactjs 中所做的事情
  • 如果您可以发布返回的 JSON 的屏幕截图或 _data 的完整格式会有所帮助
【解决方案2】:

我们通常会在 react 中遇到此类问题。原因是当 render 方法被执行时,数据可能对你不可用,你必须通过一些网络调用来获取这些数据。 您可以使用一些条件语句,例如:

let updateDate = this.props._data[0] ? this.props._data[0].updated.$t : null; 如果 this.props._data[0].updated 未定义,这将再次遇到麻烦。

所以你必须再次嵌套来检查变量是否已定义。

Lodash 为您提供了一些很酷的方法,例如get 来处理这种情况。 只需使用:

let updateDate = _.get(this.props, '_data[0].updated.$t', 'Default Value');

【讨论】:

  • 我在我的问题中添加了更多信息,也许它会澄清问题
  • 由于updateDate 是一个javascript对象,你不能直接在render方法中渲染整个对象。
猜你喜欢
  • 2020-07-23
  • 2021-04-28
  • 2016-04-22
  • 1970-01-01
  • 2015-04-04
  • 2015-09-08
  • 2016-05-09
  • 2018-06-15
  • 2017-07-20
相关资源
最近更新 更多