我刚开始学习React和JavaScript。
在学习本教程时,我得到了一个组件的示例代码,它创建了一个切换按钮:
class Toggle extends React.Component {
constructor(props) {
super(props);
this.state = {isToggleOn: true};
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.setState(prevState => ({
isToggleOn: !prevState.isToggleOn
}));
}
render() {
return (
<button onClick={this.handleClick}>
{this.state.isToggleOn ? 'ON' : 'OFF'}
</button>
);
}
}
在我看来,handleClick
函数和render
函数都使用类的this
对象,这超出了它们的范围(对吧?
那么为什么我只需要将其绑定到handleClick
中呢?
Javascript在调用时分配作用域,而不是在定义时分配作用域。您需要将handleClick()
方法bind()
到类,以便从模板调用它时,它仍可以通过this
访问类的作用域。
React 模板被编译成 javascript 函数,所以如果你没有bind()
你的onClick={this.handleClick}
处理程序的范围将限定为调用它的模板函数。在您的情况下,它将引用单击的按钮。
如果您的事件处理程序从未引用过this
则它不需要绑定,但由于您正在调用this.setState()
因此必须绑定以使处理程序了解类范围。
类中,像 componentWillMount、componentDidMount、render 等函数在渲染元素时由 react 内部调用,我们从不调用这些方法。
现在,由于作用域是在调用时决定的,因此 react 的工作是用适当的作用域调用/绑定这些方法。所以我们不需要为这些功能而烦恼。
然而,上面示例中的其他函数(如handleClick)是我们制作的方法,反应对此一无所知。此外,此方法的调用由我们定义(即单击按钮时)。因此,我们的工作是使用正确的范围调用/绑定此方法。
这就是为什么在上面的例子中我们只绑定handleClick而不绑定渲染函数。