为什么事件处理程序没有得到正确的句柄?
他们这样做!正常情况下,他们会获取对您关注事件的元素的引用。
ES6类不会自动为类方法提供this
吗?
他们没有,没有; ES2015(“ES6”)类使用与ES5相同的基本原型继承和this
赋值,并且具有不同的语法(以及一些新特性)。
然而,显式调用处理程序会给出正确的价值
权,出于同样的原因,在该代码,example
被称为与this
指x
:
x.example();
...但在此代码中,调用example
时this
为undefined
(在严格模式下;它将是松散模式下的全局对象):
let e = x.example;
e();
使用class
不会改变this
管理的需要。
为了this
指组件类,你需要或者绑定this
它,或使用关闭在this
使用箭头功能:
绑定(一个相当普遍的模式):
class MyComponent extends Component {
constructor(...args) { // ***
super(...args); // ***
this.clickHandler = this.clickHandler.bind(this); // ***
} // ***
clickHandler(event) {
console.log('this', this);
}
render() {
return <button onClick={this.clickHandler}>Button</button>;
}
}
使用箭头函数,而不是(也相当普遍的):
class MyComponent extends Component {
clickHandler = event => { // ***
console.log('this', this);
}; // ***
render() {
return <button onClick={this.clickHandler}>Button</button>;
}
}
即后者OPTIO n假设你正在支持即将发布的public class fields,这些都不是标准。(在撰写本文时,建议为still,编号为stage 2。)不是在原型上创建属性,而是使用箭头函数创建一个实例字段,该实例字段关闭this
(这是对组件实例的引用)。