【问题标题】:React undefined props issue反应未定义的道具问题
【发布时间】:2018-09-17 22:52:04
【问题描述】:

我将 props 对象传递给子组件。我遇到的问题是,有时某些嵌套值将为空或未定义,因此我收到了可怕的道具未定义消息Uncaught TypeError: Cannot read property 'xxx' of undefined

据我了解,defaultProps 仅在 props 对象为空时触发,而不是仅在其 部分 值为空时触发。

例子:

this.state {
    person: { 
        name: "Matt", 
        age: 34, 
        OtherDetails: { city:"", country: "" } 
    }
}

在上面的示例中,有时城市或国家/地区的值将为空或未定义。检查这些实例似乎非常困难和费力 - 当道具数据不完整且不可靠时,处理此类情况的最佳方法是什么?

【问题讨论】:

  • 你在使用 Redux 吗?
  • 你考虑过尝试 PropTypes 吗?
  • 是的 redux 和 PropTypes 只会触发 defaultProps ,不是吗?
  • “检查这些实例似乎非常困难和费力” 实际上一点也不。理想的解决方案是始终发送整个对象。如果您的组件需要对象的所有属性,则父组件应发送它们。但是,在使用之前检查每个对象并不难,例如const otherDetails = this.state.person.otherDetails || {} 或使用可以正确处理空值的 API,例如_.getlodash.

标签: reactjs


【解决方案1】:

如果您的问题表明您只是尝试将对象作为道具传递,然后访问组件中可能不存在的该对象的属性,那么您是否考虑过提供默认值? (这假设您使用 ES6 语法)。

我会在渲染方法中使用解构来访问我将在渲染方法中使用的每个属性,并为每个项目提供一个默认值,如下所示。

class PersonComp extends React.Component {
    render() {
        const {
            name = '',
            age = 0,
            OtherDetails: {city = ''},
            OtherDetails: {country = ''}

        } = this.props.person;

        return (
            <div>
                <div>{name}</div>
                <div>{age}</div> 
                <div>{city}</div>
                <div>{country}</div>
            </div>

        )
    }
}

通过这样做,如果提供的数据中不存在城市或国家,那么它们将被创建并分配空字符串的值。

【讨论】:

  • 这成功了,但是我必须在自己的行上分配 city = "" (而不是作为 OtherDetails 对象中的键)
猜你喜欢
  • 2018-09-16
  • 1970-01-01
  • 2021-08-21
  • 2020-12-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 2019-10-05
  • 1970-01-01
相关资源
最近更新 更多