爲什麼事件處理程序沒有得到正確的句柄?
他們這樣做!正常情況下,他們會獲取對您關注事件的元素的引用。
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
(這是對組件實例的引用)。