亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

React 如何處理傳遞給事件處理程序的函數/回調?

React 如何處理傳遞給事件處理程序的函數/回調?

慕俠2389804 2023-12-14 15:56:55
我尋找了關于這個特定問題的不同博客/文檔,我了解一個方法需要如何綁定才能在渲染函數中使用,但是文檔無法詳細解釋一些事情,函數可以通過不同的方式被傳遞到事件處理程序的是:// call a already bound funciton<button onClick={this.sayHello}>  Click me!</button>// bind in place <button onClick={this.sayHello.bind(this)}>  Click me!</button>// use es6 arrow functions<button onClick={() => alert('hello'))}>  Click me!</button>React 文檔表示,推薦的方法是綁定一個函數,否則該函數將在組件的每次渲染時被調用,并且可能會造成混亂。但是我不知道為什么每次渲染都會調用它。但它不是只有在點擊時才被調用嗎?或者onClick 如何處理或執行在 food 下傳遞的函數?
查看完整描述

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()重新渲染我們的組件的作用。當它到達同一行代碼時,它將再次重新渲染,這最終將破壞我們的應用程序。


查看完整回答
反對 回復 2023-12-14
?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

不同之處在于,當您在傳遞給某個屬性(例如案例 #2 和 #3)時聲明函數時,每次更新組件時,組件都會再次重新創建相同的函數。

另一方面,當您之前聲明它并像情況 #1 一樣傳遞它時,在組件更新時,該屬性將保留函數引用并且不會重新創建該函數。

假設情況#1 您只創建了一個函數,而情況#2 和#3 該函數將在每次更新時重新創建。


查看完整回答
反對 回復 2023-12-14
  • 2 回答
  • 0 關注
  • 156 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號