vocus logo

方格子 vocus

React JS #6 | 事件處理

koko-avatar-img
發佈於React
更新 發佈閱讀 8 分鐘

React 事件處理:讓網頁動起來~

網頁的互動性是吸引使用者、提供良好體驗的關鍵。

在 React 中,透過監聽使用者的操作(例如點擊、滑鼠移動、鍵盤輸入),並執行相應的程式碼,來實現豐富的互動效果。


React 中的事件綁定

在 React 中,事件綁定與傳統的 HTML 有些不同。React 使用駝峰式命名法 (camelCase) 來命名事件,例如 onClick、onChange、onMouseOver 等。

function MyButton() {
function handleClick() {
alert('Button clicked!');
}

return (
<button onClick={handleClick}>Click me</button>
);
}


合成事件 (Synthetic Events)

React 的合成事件是對原生瀏覽器事件的包裝。它們具有跨瀏覽器的一致性,並提供了一些額外的特性,例如自動的事件池化 (event pooling) 和阻止事件冒泡 (stopping event propagation)。

常用的合成事件包括:

  • onClick:點擊事件
  • onChange:輸入框內容改變事件
  • onSubmit:表單提交事件
  • onMouseOver:滑鼠移入事件
  • onMouseOut:滑鼠移出事件
  • onKeyDown:鍵盤按下事件
  • onKeyUp:鍵盤鬆開事件


事件處理函式的撰寫

在 React 中,事件處理函式通常定義在元件內部,並且需要注意以下幾點:

  • this 的指向: 在類別元件中,事件處理函式需要使用 .bind(this) 來綁定 this 的指向,或者使用箭頭函式來定義。
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this); // 綁定 this
}

handleClick() {
console.log('Button clicked!');
}

render() {
return <button onClick={this.handleClick}>Click me</button>;
}
}

// 或者使用箭頭函式
class MyComponent extends React.Component {
handleClick = () => {
console.log('Button clicked!');
}

render() {
return <button onClick={this.handleClick}>Click me</button>;
}
}
  • 傳遞事件物件: 事件處理函式會接收一個事件物件 (event object) 作為參數,該物件包含了事件的相關資訊,例如觸發事件的元素、事件類型、滑鼠位置等。
function MyInput() {
function handleChange(event) {
console.log(event.type); // 事件類型
console.log(event.target); // 觸發事件的元素
console.log('Input value:', event.target.value); //獲取輸入框的內容
}

return (
<input type="text" onChange={handleChange} />
);
}
  • 阻止預設行為: 有時候需要阻止事件的預設行為,例如阻止表單提交時的頁面重新整理,可以使用 event.preventDefault() 方法。
function handleSubmit(event) {
event.preventDefault(); // 阻止表單提交的預設行為
console.log('Form submitted!');
}
  • 停止事件傳播: 如果需要阻止事件冒泡,可以使用 event.stopPropagation() 方法。
function InnerComponent() {
function handleClick(event) {
event.stopPropagation(); // 阻止事件冒泡到父元素
alert('Inner component clicked!');
}

return (
<div onClick={handleClick} style={{ backgroundColor: 'lightblue' }}>
Inner Component
</div>
);
}

function OuterComponent() {
function handleClick() {
alert('Outer component clicked!');
}

return (
<div onClick={handleClick} style={{ backgroundColor: 'lightgreen' }}>
Outer Component
<InnerComponent />
</div>
);
}

function App() {
return <OuterComponent />;
}


事件委託 (Event Delegation)

事件委託是一種優化事件處理的技巧。它將事件處理函式綁定到父元素上,而不是每個子元素上。當子元素觸發事件時,事件會冒泡到父元素,由父元素統一處理。

事件委託的優點:

  • 減少事件處理函式的數量: 只需要一個事件處理函式,就可以處理多個子元素的事件。
  • 提高效能: 減少了事件綁定的數量,降低了記憶體消耗。
  • 更容易處理動態新增的元素: 新增的子元素不需要重新綁定事件處理函式。
function MyList() {
function handleClick(event) {
if (event.target.tagName === 'LI') {
console.log('List item clicked:', event.target.textContent);
}
}

return (
<ul onClick={handleClick}>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
);
}


總結

理解 React 的事件綁定、合成事件、事件處理函式的撰寫,以及事件委託等概念,可以輕鬆地實現各種互動效果,提升使用者體驗。

留言
avatar-img
koko的沙龍
1會員
34內容數
koko的沙龍的其他內容
2025/04/28
在 React 的世界裡,Props 負責從父元件向子元件傳遞資料,而 State 則是負責管理元件自身的內部資料。 State 就像元件的記憶,可以儲存元件的狀態,並根據狀態的變化來更新 UI。
Thumbnail
2025/04/28
在 React 的世界裡,Props 負責從父元件向子元件傳遞資料,而 State 則是負責管理元件自身的內部資料。 State 就像元件的記憶,可以儲存元件的狀態,並根據狀態的變化來更新 UI。
Thumbnail
2025/04/27
在 React 的世界裡,元件 (Component) 就像一個個獨立的個體,各自負責 UI 的一部分,要讓這些個體協同工作,就需要一種溝通的機制,而 Props 就是組件之間通信和數據傳遞的主要方式。
Thumbnail
2025/04/27
在 React 的世界裡,元件 (Component) 就像一個個獨立的個體,各自負責 UI 的一部分,要讓這些個體協同工作,就需要一種溝通的機制,而 Props 就是組件之間通信和數據傳遞的主要方式。
Thumbnail
2025/04/27
在 React 的世界裡,元件 (Component) 扮演著至關重要的角色。它們是構成使用者介面 (UI) 的基本 building blocks,如同積木一般,可以組合成複雜的應用程式。
Thumbnail
2025/04/27
在 React 的世界裡,元件 (Component) 扮演著至關重要的角色。它們是構成使用者介面 (UI) 的基本 building blocks,如同積木一般,可以組合成複雜的應用程式。
Thumbnail
看更多
你可能也想看
Thumbnail
創作不只是個人戰,在 vocus ,也可以是一場集體冒險、組隊升級。最具代表性的創作者社群「vocus 野格團」,現在有了更強大的新夥伴加入!除了大家熟悉的「官方主題沙龍」,這次我們徵召了 8 位領域各異的「個人主題專家」,將再度嘗試創作的各種可能,和格友們激發出更多未知的火花。
Thumbnail
創作不只是個人戰,在 vocus ,也可以是一場集體冒險、組隊升級。最具代表性的創作者社群「vocus 野格團」,現在有了更強大的新夥伴加入!除了大家熟悉的「官方主題沙龍」,這次我們徵召了 8 位領域各異的「個人主題專家」,將再度嘗試創作的各種可能,和格友們激發出更多未知的火花。
Thumbnail
看完上篇 4 位新成員的靈魂拷問,是不是意猶未盡?別急,野格團新血的驚喜正接著登場!今天下篇接力的另外 4 位「個人主題專家」,戰力同樣驚人──領域從旅行美食、運動、商業投資到自我成長;這些人如何維持長跑般的創作動力?在爆紅的文章背後,又藏著哪些不為人知的洞察?5 大靈魂拷問繼續出擊
Thumbnail
看完上篇 4 位新成員的靈魂拷問,是不是意猶未盡?別急,野格團新血的驚喜正接著登場!今天下篇接力的另外 4 位「個人主題專家」,戰力同樣驚人──領域從旅行美食、運動、商業投資到自我成長;這些人如何維持長跑般的創作動力?在爆紅的文章背後,又藏著哪些不為人知的洞察?5 大靈魂拷問繼續出擊
Thumbnail
這篇文章介紹了網站的整體架構以及開發時所使用的工具和套件,包括 Next.js、Tailwind CSS 和 socket.io 等。文章回顧了程式碼的重構與優化,幫助開發者提高工作效率,適合希望深入瞭解前端開發和網站架構的讀者。
Thumbnail
這篇文章介紹了網站的整體架構以及開發時所使用的工具和套件,包括 Next.js、Tailwind CSS 和 socket.io 等。文章回顧了程式碼的重構與優化,幫助開發者提高工作效率,適合希望深入瞭解前端開發和網站架構的讀者。
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
Function的使用方式
Thumbnail
Function的使用方式
Thumbnail
在程式任何地方都能修改各種react組件狀態的做法分享
Thumbnail
在程式任何地方都能修改各種react組件狀態的做法分享
Thumbnail
觀察者模式透過主題訂閱/訊息通知的機制,極度增強系統的可擴展性、靈活性以及降低組件間的耦合度。概念直觀簡單,是非常實用的設計模式。
Thumbnail
觀察者模式透過主題訂閱/訊息通知的機制,極度增強系統的可擴展性、靈活性以及降低組件間的耦合度。概念直觀簡單,是非常實用的設計模式。
Thumbnail
代理模式通過封裝原始對象來實現對該對象的控制和管理,同時不改變原始對象的行為或客戶端與該對象互動的方式,以此介入或增強對該對象的訪問和操作。
Thumbnail
代理模式通過封裝原始對象來實現對該對象的控制和管理,同時不改變原始對象的行為或客戶端與該對象互動的方式,以此介入或增強對該對象的訪問和操作。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News