[官網學 React] Docs:事件處理
網址(英文):https://reactjs.org/docs/handling-events.html
網址(中文):https://zh-hant.reactjs.org/docs/handling-events.html
這一篇學到許多有關 this 的運用,和要注意的地方。
在 React 的事件處理表示方式與 HTML 的不同之處:
HTML 是 string,React 是函式。
另一個不同是,在 React 不能透過回傳 false
避免預設行為。
必須明確地呼叫 preventDefault
:
這裡的 e
是一個 SyntheticEvent
,React 是依據 W3C spec 定義,所以不用擔心跨瀏覽器的相容問題。
使用 React 通常不需透過呼叫 addEventListener
在建立好的 DOM 上加一個監聽器,只要在 HTML 元素初次渲染時提供一個監聽器。
當使用 ES6 class 定義 Component 時,常見的模式是把 event handler 當成那個 class 的方法:
*必須小心在 JSX callbacks 裡的 this
定義。
在 JavaScript,class 的方法沒有預設綁定,所以若沒有綁定(bind) this.handleClick
就將之傳給 onClick,當這個函式被呼叫時,this
就會是 undefined
。
總之,當使用一個方法,卻沒有在後面加上 ()
之時(例如 onClick={this.handleClick}
),應該要為這個方法做綁定。
若不喜歡使用 bind,可以使用下面兩種方法:
這個語法的問題是每一次 LoggingButton
render 的時候,就會建立一個不同的 callback。
這個在多數情況不會有問題,但如果這個 callback 會被當成 prop 傳給下層組件,那些組件可能會多做重新渲染的動作,官網建議在建構子的地方做綁定,或使用 class fields 語法,避免影響效能。
將參數傳給 Event Handler
有兩種方法:
一個使用 arrow functions,另一個則使用了Function.prototype.bind
。
在這兩個例子,參數 e
代表 React 事件,被當作第二個參數傳遞。
第一個例子需要明確的傳遞它,寫在括號內,而第二個使用 bind 方法的例子,任何進一步的參數都會自動轉發。