javascript - React 渲染在属性中的嵌套对象上窒息

标签 javascript reactjs

我有这个 react 组件。它传递了一个名为数据的 Prop 。

数据是一个对象,如

{ 
  "title" : "some title",
  "meta" : { "name": "frank", 
             "last": "lee" 
           }
}



export default class Details extends React.Component {

  constructor () {
    super()

    this.state = {
      data: []
    }
  }

  render () {
    return (
      <div>
        <h1>{this.props.data.title}</h1>
      </div>
    )
  }
};

这渲染得很好。但是,当我尝试引用此 Prop 中包含的嵌套对象时,整个 Prop 变为“未定义”并且我无法引用任何内容。

完整错误:

Uncaught TypeError: Cannot read property 'name' of undefined

这打破了:

  render () {
    return (
      <div>
        <h1>{this.props.data.title}</h1>
        <p>{this.props.data.meta.name}</p>
      </div>
    )
  }

这打破了:

  render () {

    var name = this.props.data.meta.name

    return (
      <div>
        <h1>{this.props.data.title}</h1>
        <p>{name}</p>
      </div>
    )
  }

一切都崩溃了。我确定这是我忽略的小东西,一些额外的眼睛可能会帮助我解决这个问题。

编辑:

这是调用 Details.jsx 的组件

import Details from './Details.jsx'

export default class DetailsWrap extends React.Component{
  constructor () {
    super()

    this.state = {
      data: []
    }
  }

  loadData = (id) => {
    apipromise.getDetails(id)
    .success((response) => {

      this.setState({
        data: response
      })

    })
    .fail((response) => {

    });
  }

  componentDidMount () {

    this.loadData(this.props.id)
  }

  render () {

    return (
        <Details data={this.state.data}/>
    )
  }

};

最佳答案

看起来好像 data 不一定在 render 触发之前设置。由于您设置了初始(空)data 属性,因此当您在初始渲染上调用 this.props.data.title 时,该值为 null 但它不会爆炸,因为物体足够浅。但是,在空的 meta 属性上调用 name 会爆炸,因为 meta 不存在。

您已将 loadData 设置为使用 promise ,但该 promise 不会阻止发生错误的组件的初始呈现。你最好的选择是在 this.props.data.meta 有一个值之前不渲染任何东西,或者对冲你的 name 变量,例如。

const name = this.props.data.meta && this.props.data.meta.name;

虽然它不会爆炸,但它可能仍会闪烁 undefined

关于javascript - React 渲染在属性中的嵌套对象上窒息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39615753/

相关文章:

javascript - 使用 & 从 JS 向 PHP 传递 URL 变量导致 "&"遗漏

javascript - 为什么 Coderbyte.com 的 Javascript 模板喜欢返回函数的原始参数?

javascript - 基于名称属性的对象数组排序错误

javascript - React setState 不适用于 array.prototype.splice

javascript - 将 React 与工具创建的 SVG 一起使用

javascript - ReactJs:从数组创建组件会导致旧 Prop

reactjs - Jest 测试 Babel 错误 : Plugin/Preset files are not allowed to export objects

javascript - 无法将 FormData POST 到 Google 表格,希望限制受邀编辑电子表格的人员的访问权限

javascript - AngularJS 在同一元素上有多个指令,$compile :multidir ERROR

reactjs - 有没有办法在 React-Bootstrap 中设置自定义断点