我开始阅读Reactjs并在示例中遇到一个问题。在构造函数中将添加
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
但我无法理解,他们扮演的角色是什么,为什么需要他们?如果方法更改为箭头功能,则代码将起作用。谢谢。
完整示例:
class NameForm extends React.Component {
constructor(props) {
super(props);
this.state = {value: ''};
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleChange(event) {
this.setState({value: event.target.value});
}
handleSubmit(event) {
alert('A name was submitted: ' + this.state.value);
event.preventDefault();
}
render() {
return (
<form onSubmit={this.handleSubmit}>
<label>
Name:
<input type="text" value={this.state.value} onChange={this.handleChange} />
</label>
<input type="submit" value="Submit" />
</form>
);
}
}
因为函数将从全局上下文中调用,所以this
不会引用你的类实例,它会是undefined
么?因为当change
事件发生时,React将简单地调用你的方法,就像这个youHandler(event)
一样,你可以看到该函数不具有this
值,因为它是从全局上下文中调用的。我给你一个纯javascript(反应范围之外)的例子:
<input id="myInput" type="text" onChange="myFunction()">
<script>
"use strict";
function myFunction() {
console.log(this); // this is undefined here
}
</script>
所以你需要使用bind
方法来设置this
的值,它将等于当前的类实例
此外,箭头功能没有自己的this
;创建箭头函数时,将使用封闭词汇上下文的此值。你可以阅读doc here,所以如果你写:
handleChange = event => {
this.setState({value: event.target.value});
}
你必须问自己以下问题:当this
函数被创建时,handleChange
的价值是多少?这里它将等于NameForm
类的当前实例,这实际上就是你想要的。