我写了这个React组件:
import React from 'react';
export default class Todo extends React.Component {
constructor(props) {
super(props);
// Set initial state
this.state = {
data: props.data
}
}
changeStatus() {
// This throws: Uncaught TypeError: Cannot read property 'state' of undefined
console.log(this.state);
console.log('status changed');
}
render() {
let status = this.state.data.opened ? 'opened' : 'closed';
return (
<li className={"todo " + status} data-endpoint={this.state.data['@id']}>
<div className="status">
<input type="checkbox" checked={!this.state.data.opened} onChange={this.changeStatus}/>
</div>
<a href={window.Routing.generate('todo_list_todo_show', {account: this.props.todoList.account.id, list: this.props.todoList.id, todo: this.state.data.id}, true)}>{this.state.data.name}</a>
</li>
);
}
}
我希望选中并取消选中该复选框,具体取决于对服务器的调用以更新数据库中的行。
不幸的是console.log()
引发了异常:
未捕获的TypeError:无法读取属性&#39; state&#39;未定义的
在changeStatus(Todo.jsx:20)
如何在处理状态更改的方法中访问state
?
答案 0 :(得分:1)
在构造函数中绑定changeStatus
方法 -
constructor(props) {
super(props);
// Set initial state
this.state = {
data: props.data
}
this.changeStatus = this.changeStatus.bind(this);
}
您可以阅读为何需要绑定here。
答案 1 :(得分:1)
如果您使用的是ES6,则可以避免使用箭头功能键入绑定。
这种方式<html>
<head>
<title> OLL </title>
</head>
<body>
<div id="foo"></div>
<script type=text/javascript>
var img = new Image();
var div = document.getElementById('foo');
img.onload = function() {
div.appendChild(img);
};
img.src = 'bone.jpg';
</script>
</body>
</html>
会自动绑定到函数。
this
箭头函数在词汇上绑定它们的上下文,因此
changeStatus = () => { // This throws: Uncaught TypeError: Cannot read property 'state' of undefined console.log(this.state); console.log('status changed'); }
实际上是指 原始背景。