无法读取 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