为什么我们需要在反应中绑定事件处理程序
Why do we need to bind a event handler in react
我知道你可能觉得这是一个多余的问题,但请听我说完。
我正在使用 React class 组件,我刚刚了解到我们需要在组件的构造函数中绑定一个事件处理函数,以便在事件处理程序中访问 this.setState()
。现在根据我对 JavaScript classes 的了解,this
可以通过 class.
中的任何方法访问
为了证明我在说什么,这里是代码:
class Parent {
setState() {
console.log("Set State is called");
}
}
class Child extends Parent {
eventHandler() {
this.setState();
}
render() {
console.log("Render method called");
console.log("assume an event happened and event handler is called");
this.eventHandler();
}
}
new Child().render()
以上代码的输出为:
Render method called
assume an event happened and event handler is called
Set State is called
将上面的代码与 React 的工作方式进行对比(即假设 setState
是 class React.Component
中定义的方法),为什么当 this.setState()
在事件处理程序中被调用?
我错过的关键点是 class 中定义的方法在重新分配时会丢失其上下文。
所以当我们这样做时,
<SomeComponent onClick={eventHandler} />
eventHandler
被重新分配给其他一些变量,并由 React 内部调用。由于这种重新分配,eventHandler
将失去其上下文,并且在内部被 React 调用时,它不会有 this
.
要明确地将 this
绑定到 eventHandler
以便它即使在重新分配后也不会丢失其上下文,我们这样做:
this.eventHandler = this.eventHandler.bind(this)
请参阅 this 文章以获得深入的解释。
我知道你可能觉得这是一个多余的问题,但请听我说完。
我正在使用 React class 组件,我刚刚了解到我们需要在组件的构造函数中绑定一个事件处理函数,以便在事件处理程序中访问 this.setState()
。现在根据我对 JavaScript classes 的了解,this
可以通过 class.
为了证明我在说什么,这里是代码:
class Parent {
setState() {
console.log("Set State is called");
}
}
class Child extends Parent {
eventHandler() {
this.setState();
}
render() {
console.log("Render method called");
console.log("assume an event happened and event handler is called");
this.eventHandler();
}
}
new Child().render()
以上代码的输出为:
Render method called
assume an event happened and event handler is called
Set State is called
将上面的代码与 React 的工作方式进行对比(即假设 setState
是 class React.Component
中定义的方法),为什么当 this.setState()
在事件处理程序中被调用?
我错过的关键点是 class 中定义的方法在重新分配时会丢失其上下文。
所以当我们这样做时,
<SomeComponent onClick={eventHandler} />
eventHandler
被重新分配给其他一些变量,并由 React 内部调用。由于这种重新分配,eventHandler
将失去其上下文,并且在内部被 React 调用时,它不会有 this
.
要明确地将 this
绑定到 eventHandler
以便它即使在重新分配后也不会丢失其上下文,我们这样做:
this.eventHandler = this.eventHandler.bind(this)
请参阅 this 文章以获得深入的解释。