iT邦幫忙

2021 iThome 鐵人賽

DAY 22
1
Modern Web

React 前端工程師的兩把刷子系列 第 22

[Day22] React x TS 中的 Event Handler

  • 分享至 

  • xImage
  •  

React EventHandler in TypeScript

今天來分享一個小東西,記得以前一開始用 React 搭配 TypeScript 開發專案的時候,在寫 Event Handler 的時候,常常會碰到不知道 Event Handler 中 e 的型別是什麼的情況,就像上圖中 ??? 的位置,如果沒有告知其型別,同時 tsconfig 設定檔中的 strict 又設定成 true 時,因為在沒有定義型別的情況下,該變數預設就會推斷成 any(implicitly any),於是 TS 就會提示錯誤:

React EventHandler in TypeScript

這時候必須明確告知這個 e 的型別,以 click 事件來說,它的型別就是 React.MouseEvent<HTMLButtonElement>

React EventHandler in TypeScript

這時候 TypeScript 就不會報錯。

讀者可能接著問,那如果是表單中的 onChange 事件呢?它的 Event Handler 中的 e 型別會是什麼呢?

React EventHandler in TypeScript

答案是 React.ChangeEvent<HTMLInputElement>

React EventHandler in TypeScript

讀者可能又會問,DOM 上面能綁定的事件這麼多,還有鍵盤相關的事件(keydownkeypresskeyup)、scroll 相關的事件、touch 相關的事件,該怎麼辦呢?有地方可以查表嗎?

這裡讓筆者全部列給你:

  • onKeyDown 的事件是 React.KeyboardEvent<HTMLInputElement>
  • onScroll 的事件是 React.UIEventHandler<HTMLDivElement>
  • onTouchEnd 的事件是 React.TouchEvent<HTMLDivElement>
  • ...

然後背下來就好,明天抽考。

.

.

.

.

.

如果我請你背下來,我就真的在害你 XD

.

.

.

.

.

實際上,我以前一開始接觸 React x TypeScript 時也不知道事件的型別這麼多該怎麼辦,就算真的有表可以查,還是相當麻煩的一件事,後來傻傻的我發現到,只要把滑鼠移到該事件上面,你就可以知道這個 e 的型別要填什麼了。

舉例來說,只要在 DOM 上先寫出你想監聽的事件,例如這裡來看 div 上的 onTouchEnd 事件,然後把滑鼠移上去(注意是移到 onTouchEnd 的名稱上,而不是 {} 出現紅色毛毛蟲的地方),就會看到型別的名稱寫 React.TouchEventHandler<HTMLDivElement>,而 e 的型別只需要把 TouchEventHandler 最後的 Handler 移掉就是了,所以就會是 React.TouchEvent<HTMLDivElement>

React EventHandler in TypeScript

備註:滑鼠要移到 onXXX 的事件名稱上,而不是 {} 中 TypeScript 冒出紅色毛毛蟲的地方。

同樣的道理,如果是在 input 元素上的 onKeyDown 事件,先在 DOM 上寫成 onKeyDown,然後滑鼠移上去:

React EventHandler in TypeScript

上面寫的是 React.KeyboardEventHandler<HTMLInputElement> ,因此移掉最後的 Handler 後,讀者就會知道,onKeyDown Event Handler 中的參數 e 其型別會是 React.KeyboardEvent<HTMLInputElement>

以後如果同事問你,你怎麼知道這些事件參數的型別是什麼,要回答「我背了兩個禮拜才全部背下來」,或是把這個方法告訴他/她,就看你們的交情了...。


上一篇
[Day21] Conditional Chains
下一篇
[Day23] TS:談談讓人又愛又恨的 enum
系列文
React 前端工程師的兩把刷子30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言