一開始學習react的時候就了解了react的每個方法都要bind(this)或者使用箭頭函數綁定this的指向,到底是為什么要這么寫呢,當時要學習的東西太多了就沒在意,今天特別好奇(不搞懂不吃飯的態度),就深入學習一下
SyntheticEvent是個什么東西
react官網有一節介紹了SyntheticEvent,大家可以去官網了解一下,我也就是簡單了解了一下,dom樹上綁定事件是耗性能的,一個頁面,如果你在dom節點上綁了很多事件,但是用戶就點了幾個按鈕,那其他事件綁上去豈不是浪費了?
react就考慮到了這一點,你在render里綁定的事件並不是真的綁在真實dom上的(綁在虛擬dom上),而是在document這個根節點上綁了個SyntheticEvent,當用戶點擊的時候事件冒泡到document上,SyntheticEvent收到后再在真實dom上通過
回調(回調是重點)執行你在render上綁定的事件。
當然SyntheticEvent還解決了瀏覽器兼容性的問題。
this的指向
<button onClick={this.add}>add</button>
一個button綁定了組件中(this中)一個叫add的方法,前面說了SyntheticEvent被觸發時是回調this里面的add方法,也就是說執行add方法並不是當前組件這個this,自然add方法里也獲取不到當前組件這個this了,所以需要你自己去綁定上去啦。
回調可能還有些不理解,這里有個例子
class Cat {
sayThis () {
console.log(this); // 這里的 `this` 指向誰?
}
exec (cb) {
cb();
}
render () {
this.exec(this.sayThis);
}
}
const tom = new Cat();
tom.render(); // 輸出結果是什么?
網上抄的例子,大家看一下例子應該明白了什么叫回調會改變this了
以上就是本人對react事件綁定的一些見解,如有不對的地方,希望各路大神能提出來,讓小弟能漲漲見識
