2 回答

TA貢獻1802條經驗 獲得超5個贊
React 使用合成事件。如果您使用基于類的組件,則需要將函數范圍綁定到該類(only when we do not use arrow functions in our class),否則關鍵字的范圍this將在該函數中丟失。這意味著如果使用普通的 ES5 函數作為處理程序并且我們this.setState()在其中使用,它將無法按預期工作。
如果您arrow function在類中用作處理函數,則無需將其綁定到類的范圍,因為箭頭函數的范圍是其上方的一個執行上下文。
如果您使用的是功能組件。沒有this可用的關鍵字,您直接調用函數(函數本身外部或內部的處理程序)
現在:讓我解釋一下語法:
語法-1:
// call a already bound funciton
<button onClick={this.sayHello}>
Click me!
</button>
sayHello您只需在 Component 類中擁有一個名為(如下所示)的事件處理程序。
sayHello(){ ... } // Binded in constructor by doing this.sayHello = this.sayHello.bind(this)
或者
sayHello = ()=>{}
單擊按鈕時將調用/調用處理程序。
語法2:
// bind in place
<button onClick={this.sayHello.bind(this)}>
Click me!
</button>
this這種語法是在我們的處理函數中綁定關鍵字語法的另一種簡單方法sayHello,原因與我上面提到的相同。
語法3:
// use es6 arrow functions
<button onClick={() => sayHello('hello'))}>
Click me!
</button>
每當我們想要將參數傳遞給處理函數時,我們都會使用這種語法。因此,在這種情況下,當單擊按鈕時,我們的sayHello函數將獲取值“hello”作為參數。
你最后的懷疑:當 React 文檔說該函數將在組件的每次渲染時被調用,并且可能會造成混亂。它們意味著,如果您僅在使用()=>{}語法的元素內錯誤地使用事件處理程序,并且還在this.setState()其中使用了 a,它將強制重新渲染。因為這就是setState()重新渲染我們的組件的作用。當它到達同一行代碼時,它將再次重新渲染,這最終將破壞我們的應用程序。

TA貢獻2041條經驗 獲得超4個贊
不同之處在于,當您在傳遞給某個屬性(例如案例 #2 和 #3)時聲明函數時,每次更新組件時,組件都會再次重新創建相同的函數。
另一方面,當您之前聲明它并像情況 #1 一樣傳遞它時,在組件更新時,該屬性將保留函數引用并且不會重新創建該函數。
假設情況#1 您只創建了一個函數,而情況#2 和#3 該函數將在每次更新時重新創建。
添加回答
舉報