
- ReactJS 教程
- ReactJS - 首頁
- ReactJS - 簡介
- ReactJS - 路線圖
- ReactJS - 安裝
- ReactJS - 功能
- ReactJS - 優點與缺點
- ReactJS - 架構
- ReactJS - 建立 React 應用
- ReactJS - JSX
- ReactJS - 元件
- ReactJS - 巢狀元件
- ReactJS - 使用新建立的元件
- ReactJS - 元件集合
- ReactJS - 樣式
- ReactJS - 屬性 (props)
- ReactJS - 使用屬性建立元件
- ReactJS - props 驗證
- ReactJS - 建構函式
- ReactJS - 元件生命週期
- ReactJS - 事件管理
- ReactJS - 建立事件感知元件
- ReactJS - 在 Expense Manager 應用中引入事件
- ReactJS - 狀態管理
- ReactJS - 狀態管理 API
- ReactJS - 無狀態元件
- ReactJS - 使用 React Hooks 進行狀態管理
- ReactJS - 使用 React Hooks 進行元件生命週期管理
- ReactJS - 佈局元件
- ReactJS - 分頁
- ReactJS - Material UI
- ReactJS - Http 客戶端程式設計
- ReactJS - 表單程式設計
- ReactJS - 受控元件
- ReactJS - 非受控元件
- ReactJS - Formik
- ReactJS - 條件渲染
- ReactJS - 列表
- ReactJS - Keys
- ReactJS - 路由
- ReactJS - Redux
- ReactJS - 動畫
- ReactJS - Bootstrap
- ReactJS - Map
- ReactJS - 表格
- ReactJS - 使用 Flux 管理狀態
- ReactJS - 測試
- ReactJS - CLI 命令
- ReactJS - 構建和部署
- ReactJS - 示例
- Hooks
- ReactJS - Hooks 簡介
- ReactJS - 使用 useState
- ReactJS - 使用 useEffect
- ReactJS - 使用 useContext
- ReactJS - 使用 useRef
- ReactJS - 使用 useReducer
- ReactJS - 使用 useCallback
- ReactJS - 使用 useMemo
- ReactJS - 自定義 Hooks
- ReactJS 高階
- ReactJS - 可訪問性
- ReactJS - 程式碼分割
- ReactJS - Context
- ReactJS - 錯誤邊界
- ReactJS - 轉發 Refs
- ReactJS - Fragments
- ReactJS - 高階元件
- ReactJS - 與其他庫整合
- ReactJS - 效能最佳化
- ReactJS - Profiler API
- ReactJS - Portals
- ReactJS - 無 ES6 ECMAScript 的 React
- ReactJS - 無 JSX 的 React
- ReactJS - 協調
- ReactJS - Refs 和 DOM
- ReactJS - Render Props
- ReactJS - 靜態型別檢查
- ReactJS - Strict Mode
- ReactJS - Web Components
- 附加概念
- ReactJS - 日期選擇器
- ReactJS - Helmet
- ReactJS - 內聯樣式
- ReactJS - PropTypes
- ReactJS - BrowserRouter
- ReactJS - DOM
- ReactJS - 走馬燈
- ReactJS - 圖示
- ReactJS - 表單元件
- ReactJS - 參考 API
- ReactJS 有用資源
- ReactJS - 快速指南
- ReactJS - 有用資源
- ReactJS - 討論
ReactJS - 事件管理
事件只是使用者與任何應用程式互動時執行的一些操作。它們可以是最小的操作,例如將滑鼠指標懸停在觸發下拉選單的元素上、調整應用程式視窗大小或拖放元素以上傳它們等。React 中的事件分為三類
滑鼠事件 − onClick、onDrag、onDoubleClick
鍵盤事件 − onKeyDown、onKeyPress、onKeyUp
焦點事件 − onFocus、onBlur
對於這些事件中的每一個,JavaScript 都提供響應。因此,每次使用者執行事件時,通常都需要應用程式做出某種型別的反應;這些反應被定義為一些函式或程式碼塊,稱為事件處理程式。使用事件處理程式處理事件的整個過程稱為事件管理。
ReactJS 中的事件管理
事件管理是 Web 應用程式中的重要功能之一。它使使用者能夠與應用程式互動。React 支援 Web 應用程式中可用的所有事件。React 事件處理與 DOM 事件非常相似,只有細微的差別。以下是可以在基於 React 的網站上觀察到的一些常見事件:
單擊元件。
滾動當前頁面。
將滑鼠懸停在當前頁面的元素上。
提交表單。
重定向到另一個網頁。
載入影像。
合成 React 事件
在 JavaScript 中,當指定事件時,您將處理稱為合成事件的 React 事件型別,而不是常規 DOM 事件。SyntheticEvent 是本機事件例項的簡單跨瀏覽器包裝器,使事件在所有瀏覽器中都能以相同的方式工作。所有事件處理程式都必須作為此包裝器的例項傳遞。但是,就 CPU 資源而言,它成本很高,因為每個建立的合成事件都需要進行垃圾回收。每個合成事件物件都具有以下屬性:
布林值 bubbles
布林值 cancelable
DOMEventTarget currentTarget
布林值 defaultPrevented
數字 eventPhase
布林值 isTrusted
DOMEvent nativeEvent
void preventDefault()
布林值 isDefaultPrevented()
void stopPropagation()
布林值 isPropagationStopped()
void persist()
DOMEventTarget target
數字 timeStamp
字串 type
由於合成事件使用了大量資源,因此它們通常會被重用,並且在呼叫事件回撥後,其所有屬性都將被清除,以最佳化其在瀏覽器中的效能。SyntheticEvent 與本機事件具有相同的介面。由於合成事件由文件節點授權,因此先觸發本機事件,然後觸發合成事件。
新增事件
正如我們已經看到的,React 具有與 HTML 相同的事件:click、change、mouseover 等。但是,React 事件是用 camelCase 定義的,反應寫在花括號內。新增事件的語法在函式式元件和類元件中有所不同。
以下是向 React 函式式元件新增 onClick 事件的語法
onClick = {action to be performed}
以下是向 React 類元件新增 onClick 事件的語法
onClick = {this.action_to_be_performed}
處理事件
現在讓我們學習如何透過以下分步過程在 React 應用程式中處理這些事件。
定義一個事件處理程式方法來處理給定的事件。
log() { console.log("Event is fired"); }
React 提供了一種使用 lambda 函式定義事件處理程式的替代語法。lambda 語法為:
log = () => { console.log("Event is fired"); }
向事件處理程式傳遞引數
有兩種方法可以向事件處理程式傳遞引數
箭頭方法
繫結方法
箭頭方法
如果要了解事件的目標,則在處理程式方法中新增引數e。React 將把事件目標詳細資訊傳送到處理程式方法。
log(e) { console.log("Event is fired"); console.log(e.target); }
替代 lambda 語法為:
log = (e) => { console.log("Event is fired"); console.log(e.target); }
如果要在事件期間傳送額外的詳細資訊,則將額外詳細資訊作為初始引數新增,然後為事件目標新增引數(e)。
log(extra, e) { console.log("Event is fired"); console.log(e.target); console.log(extra); console.log(this); }
替代 lambda 語法如下:
log = (extra, e) => { console.log("Event is fired"); console.log(e.target); console.log(extra); console.log(this); }
繫結方法
我們還可以將事件處理程式方法繫結到元件的建構函式中。這將確保在事件處理程式方法中可以使用this。
constructor(props) { super(props); this.logContent = this.logContent.bind(this); }
如果事件處理程式是在替代 lambda 語法中定義的,則不需要繫結。this 關鍵字將自動繫結到事件處理程式方法。
為特定事件設定事件處理程式方法,如下所示:
<div onClick={this.log}> ... </div>
要設定額外引數,請繫結事件處理程式方法,然後將額外資訊作為第二個引數傳遞。
<div onClick={this.log.bind(this, extra)}> ... </div>
替代 lambda 語法如下:
<div onClick={this.log(extra, e)}> ... </div>
這裡: