一開始學習react的時候就了解了react的每個方法都要bind(this)或者使用箭頭函式繫結this的指向,到底是為什麼要這麼寫呢,當時要學習的東西太多了就沒在意,今天特別好奇(不搞懂不吃飯的態度),就深入學習一下
react官網有一節介紹了syntheticevent,大家可以去官網了解一下,我也就是簡單了解了一下,dom樹上繫結事件是耗效能的,乙個頁面,如果你在dom節點上綁了很多事件,但是使用者就點了幾個按鈕,那其他事件綁上去豈不是浪費了?
react就考慮到了這一點,你在render裡繫結的事件並不是真的綁在真實dom上的(綁在虛擬dom上),而是在document這個根節點上綁了個syntheticevent,當使用者點選的時候事件冒泡到document上,syntheticevent收到後再在真實dom上通過
**(**是重點)執行你在render上繫結的事件。
當然syntheticevent還解決了瀏覽器相容性的問題。
add
乙個button繫結了元件中(this中)乙個叫add的方法,前面說了syntheticevent被觸發時是**this裡面的add方法,也就是說執行add方法並不是當前元件這個this,自然add方法裡也獲取不到當前元件這個this了,所以需要你自己去繫結上去啦。
**可能還有些不理解,這裡有個例子
class cat
exec (cb)
render ()
}const tom = new cat();
tom.render(); // 輸出結果是什麼?
網上抄的例子,大家看一下例子應該明白了什麼叫**會改變this了
以上就是本人對react事件繫結的一些見解,如有不對的地方,希望各路大神能提出來,讓小弟能漲漲見識
HashMap底層為什麼一定用陣列
hashmap原始碼資料結構 entry table new entry capacity 其中,entry就是乙個鍊錶節點。如果將陣列替換成linkedlist是否可行?如下 listtable new linkedlist 將陣列替換成linkedlist是可以的,但是hashmap選用陣列的原...
HashMap底層為什麼一定用陣列
hashmap原始碼資料結構 entry table new entry capacity 其中,entry就是乙個鍊錶節點。如果將陣列替換成linkedlist是否可行?如下 listtable new linkedlist 將陣列替換成linkedlist是可以的,但是hashmap選用陣列的原...
為什麼重寫就一定需要重寫HashCode方法
equals 和 hashcode方法是屬於object的,所以每個物件都有自己的equals 和 hashcode方法。在object中equals方法是用來判斷兩個物件是否是同乙個也就是他們的儲存位址是一樣的。但是往往我們有自己的需要定義equal,所以重寫equals方法很重要!下面來說說eq...