开发者问题收集

无法读取 React 中未定义的属性“someProperty”

2020-04-17
330

我正在开发一个应用程序,我使用状态将 Navlink 中的变量值从一个组件传递到另一个组件,然后将这些接收到的值加载到输入字段中,然后单击另一个组件中的提交按钮以对值执行某些操作。我的值被正确接收并在我提醒它们时正确显示。但是当我单击提交按钮时,它给出错误,指向构造函数

TypeError: Cannot read property 'id' of undefined

这是我的代码

class Parent extends React.Component{
    constructor(props) {
        super(props);
        this.state={id:2}
    } 

    render(){
       return(
         <NavLink 
           to={{
             pathname: '/Child',
             state: {
               id: this.state.id
             }
           }}
         >
           Edit
         </NavLink>
       )
    )
}

我接收值的位置

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

        this.state = {id:this.props.location.state.id}
        alert(this.props.location.state.id)//works fine
    }

    setId(e){
        this.setState({id:e.target.value})
    }

    addOrEdit(){ //gives error    
        alert(this.state.id) 
        //do something    
    }

    render(){
        return(
          <div>
            <form>
              <label>Id</label>
              <input value={this.state.id} onChange={this.setId.bind(this)}  type="text"/><br/>
              <input type="submit" onClick={this.addOrEdit.bind(this)} ></input>
            </form>
          </div>
        )
    }
}
2个回答

 this.state = {id: this.props.location && this.props.location.state && this.props.location.state.id}

应该修复您的问题,该问题是由于此组件在没有此上下文的情况下调用或在设置 location 之前执行此行而导致的。 (假设您使用 withRouter 使位置属性存在...)

无论如何,与您的问题没有直接关系,在构造函数中从属性设置状态的初始值是不好的做法,请考虑通过生命周期操纵状态,不要在这里使用状态并直接引用属性

Hagai Harari
2020-04-17

我建议只对 setId 和 addOrEdit 使用箭头函数。

addOrEdit = (e) => {
    // ...
}

然后直接调用它们:

onChange={this.setId}
onClick={this.addOrEdit}

https://medium.com/@machnicki/handle-events-in-react-with-arrow-functions-ede88184bbb

此外,您还可以从 prop 中派生出状态。 最好直接使用 prop。

https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html

d3bgger
2020-04-17