React 響應事件

開發環境:React+ts+antd

使用 React 可以在 JSX 中添加 事件處理函數。其中事件處理函數為自定義函數,它將在響應交互(如點擊、懸停、表單輸入框獲得焦點等)時觸發。

學習內容
1.編寫事件處理函數的不同方法
2.如何從父組件傳遞事件處理邏輯
3.事件如何傳播以及如何停止它們

添加事件處理函數

如需添加一個事件處理函數,你需要先定義一個函數,然后 將其作為 prop 傳入 合適的 JSX 標簽。

import React from "react";
import { Button } from 'antd';const App:React.FC=()=>{const handleClick = () => {alert('你點擊了按鈕!')}return (<div><Button type="primary" onClick={handleClick}>點我看看</Button></div>)
}export default App

你可以定義 handleClick 函數然后 將其作為 prop 傳入 。其中 handleClick 是一個 事件處理函數 。事件處理函數有如下特點:

  • 通常在你的組件 內部 定義。
  • 名稱以 handle 開頭,后跟事件名稱。

或者,你也可以在 JSX 中定義一個內聯的事件處理函數:

<Button type="primary" onClick={() => {alert('你點擊了按鈕');
}}>點我看看</Button>

在這里插入圖片描述

在事件處理函數中讀取 props

由于事件處理函數聲明于組件內部,因此它們可以直接訪問組件的 props。示例中的按鈕,當點擊時會彈出帶有 message prop 的 alert:

import React from "react";
import { Button } from 'antd';interface MessagePro{message:stringchildren:React.ReactNode
}const AlertButton:React.FC<MessagePro> = ({message,children}) => {return(<Button type="primary" onClick={()=>{alert(message)}}>{children}</Button>)
}const App:React.FC=()=>{return (<div><div><AlertButton message="正在播放!">播放電影</AlertButton><AlertButton message="正在上傳!">上傳圖片</AlertButton></div></div>)
}export default App

在這里插入圖片描述

將事件處理函數作為 props 傳遞

通常,我們會在父組件中定義子組件的事件處理函數。比如:置于不同位置的 Button 組件,可能最終執行的功能也不同 —— 也許是播放電影,也許是上傳圖片。

為此,將組件從父組件接收的 prop 作為事件處理函數傳遞,如下所示:

import React from 'react';
import {Button as AntdButton} from 'antd';// 自定義 Button 組件的 props 類型
interface CustomButtonProps {onClick: () => void,children: React.ReactNode,variant: any,color:any,
}// 自定義 Button 組件
const CustomButton: React.FC<CustomButtonProps> = ({onClick, children, variant,color}) => {return (<AntdButton onClick={onClick} variant={variant} color={color}>{children}</AntdButton>);
};// PlayButton 組件的 props 類型
interface PlayButtonProps {movieName: string;
}// PlayButton 組件
const PlayButton: React.FC<PlayButtonProps> = ({movieName}) => {const handlePlayClick = () => {alert(`正在播放 ${movieName}`);};return (<CustomButton onClick={handlePlayClick} variant="solid" color="blue">播放  "{movieName}"</CustomButton>);
};// UploadButton 組件
const UploadButton: React.FC = () => {return (<CustomButton onClick={() => alert('正在上傳!')} variant="solid" color="red">上傳圖片</CustomButton>);
};// Toolbar 組件
const Toolbar: React.FC = () => {return (<div><PlayButton movieName="斯巴達克斯"/><UploadButton/></div>);
};export default Toolbar;

在這里插入圖片描述

事件傳播

事件處理函數還將捕獲任何來自子組件的事件。通常,我們會說事件會沿著樹向上“冒泡”或“傳播”:它從事件發生的地方開始,然后沿著樹向上傳播。

下面這個

包含兩個按鈕。
和每個按鈕都有自己的 onClick 處理函數。你認為點擊按鈕時會觸發哪些處理函數?

import React from 'react';
import { Button as AntdButton } from 'antd';// 定義自定義按鈕組件的 props 類型
interface CustomButtonProps {onClick: () => void;children: React.ReactNode;
}// 自定義按鈕組件
const CustomButton: React.FC<CustomButtonProps> = ({ onClick, children }) => {const handleClick = () => {onClick();};return (<AntdButton onClick={handleClick} type="primary">{children}</AntdButton>);
};// Toolbar 組件
const Toolbar: React.FC = () => {return (<div className="Toolbar" style={{background:'gray',padding:'20px',}} onClick={() => {alert('你點擊了 toolbar !');}}><CustomButton onClick={() => alert('正在播放!')}>播放電影</CustomButton><CustomButton onClick={() => alert('正在上傳!')}>上傳圖片</CustomButton></div>);
};export default Toolbar;

如果你點擊任一按鈕,它自身的 onClick 將首先執行,然后父級

的 onClick 會接著執行。因此會出現兩條消息。如果你點擊 toolbar 本身,將只有父級
的 onClick 會執行。

阻止傳播

事件處理函數接收一個 事件對象 作為唯一的參數。按照慣例,它通常被稱為 e ,代表 “event”(事件)。你可以使用此對象來讀取有關事件的信息。

這個事件對象還允許你阻止傳播。如果你想阻止一個事件到達父組件,你需要像下面 Button 組件那樣調用 e.stopPropagation() :

import React from 'react';
import { Button as AntdButton } from 'antd';// 定義自定義按鈕組件的 props 類型
interface CustomButtonProps {onClick: () => void;children: React.ReactNode;
}// 自定義按鈕組件
const CustomButton: React.FC<CustomButtonProps> = ({ onClick, children }) => {const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {e.stopPropagation();onClick();};return (<AntdButton onClick={handleClick} type="primary">{children}</AntdButton>);
};// Toolbar 組件
const Toolbar: React.FC = () => {return (<div className="Toolbar" style={{background:'gray',padding:'20px',}} onClick={() => {alert('你點擊了 toolbar !');}}><CustomButton onClick={() => alert('正在播放!')}>播放電影</CustomButton><CustomButton onClick={() => alert('正在上傳!')}>上傳圖片</CustomButton></div>);
};export default Toolbar;

由于調用了 e.stopPropagation(),點擊按鈕現在將只顯示一個 alert(來自 ),而并非兩個(分別來自 和父級 toolbar

)。點擊按鈕與點擊周圍的 toolbar 不同,因此阻止傳播對這個 UI 是有意義的。

阻止默認行為

某些瀏覽器事件具有與事件相關聯的默認行為。例如,點擊 表單內部的按鈕會觸發表單提交事件,默認情況下將重新加載整個頁面:

import React from 'react';// Toolbar 組件
const Toolbar: React.FC = () => {return (<div className="Toolbar" style={{background: 'gray', padding: '20px',}}><form onSubmit={() => alert('提交表單!')}><input/><button>發送</button></form></div>);
};export default Toolbar;

你可以調用事件對象中的 e.preventDefault() 來阻止這種情況發生:

import React from 'react';// Toolbar 組件
const Toolbar: React.FC = () => {return (<div className="Toolbar" style={{background: 'gray', padding: '20px',}}><form onSubmit={(e) => {e.preventDefault();alert('提交表單!')}}><input/><button>發送</button></form></div>);
};export default Toolbar;

不要混淆 e.stopPropagation() 和 e.preventDefault()。它們都很有用,但二者并不相關:

  • e.stopPropagation() 阻止觸發綁定在外層標簽上的事件處理函數。
  • e.preventDefault() 阻止少數事件的默認瀏覽器行為。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901199.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901199.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901199.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQL基礎入門:從CRUD到JOIN再到索引(通俗易懂版)

一、為什么需要SQL&#xff1f; 想象你在管理一個圖書館&#xff1a; 傳統方法&#xff1a;手動記錄每本書的位置、借閱者、歸還日期SQL方法&#xff1a;用數據庫系統自動管理&#xff0c;快速查詢《Java編程思想》在哪個書架 SQL&#xff08;Structured Query Language&…

MINIQMT學習課程Day11

現在開始進行策略的交易買賣分析&#xff1a; 還是之前的步驟&#xff0c;打開qmt&#xff0c;選擇獨立交易&#xff0c; 之后使用pycharm&#xff0c;編寫py文件 導入包&#xff1a; import time, datetime, traceback, sys from xtquant import xtdata from xtquant.xttr…

# 實時人臉性別與年齡識別:基于OpenCV與深度學習模型的實現

實時人臉性別與年齡識別&#xff1a;基于OpenCV與深度學習模型的實現 在當今數字化時代&#xff0c;計算機視覺技術正以前所未有的速度改變著我們的生活與工作方式。其中&#xff0c;人臉檢測與分析作為計算機視覺領域的重要分支&#xff0c;已廣泛應用于安防監控、智能交互、…

Python Cookbook-5.14 給字典類型增加排名功能

任務 你需要用字典存儲一些鍵和“分數”的映射關系。你經常需要以自然順序(即以分數的升序)訪問鍵和分數值&#xff0c;并能夠根據那個順序檢查一個鍵的排名。對這個問題&#xff0c;用dict 似乎不太合適。 解決方案 我們可以使用 dict 的子類&#xff0c;根據需要增加或者重…

十四種邏輯器件綜合對比——《器件手冊--邏輯器件》

目錄 邏輯器件 簡述 按功能分類 按工藝分類 按電平分類 特殊功能邏輯器件 應用領域 詳盡闡述 1 邏輯門 一、基本概念 二、主要類型 三、實現方式 四、應用領域 2 反相器 工作原理 基本功能 主要應用 常見類型 特點 未來發展趨勢 3 鎖存器 基本概念 工作原理 主要類型…

如何更改wsl2中的ubuntu默認安裝位置

先前的一篇文章提到了如何更改wsl里面ubuntu的home目錄&#xff0c;wsl裝ubuntu的home目錄在哪&#xff0c;如何更改home&#xff1f;_wsl安裝的ubuntu在哪里-CSDN博客 這次是要更改wsl中ubuntu的安裝目錄&#xff0c;畢竟默認安裝到c盤下會占用不少空間的。 從微軟商店get后…

最近在工作中感受到了設計模式的重要性

之前了解設計模式&#xff1a;只是應付一下面試 在之前一年多的工作中也沒遇到使用場景 最近在搭建驗證環境的時候&#xff0c;才發現這玩意這么重要 首先是設計模式的使用場景一定是在很復雜繁瑣的場景下進行的 之所以說是復雜/繁瑣的場景&#xff0c;因為一些場景也許邏輯不難…

Python深度學習基礎——卷積神經網絡(CNN)(PyTorch)

CNN原理 從DNN到CNN 卷積層與匯聚 深度神經網絡DNN中&#xff0c;相鄰層的所有神經元之間都有連接&#xff0c;這叫全連接&#xff1b;卷積神經網絡 CNN 中&#xff0c;新增了卷積層&#xff08;Convolution&#xff09;與匯聚&#xff08;Pooling&#xff09;。DNN 的全連接…

Linux 第三講 --- 基礎指令(三)

前言&#xff1a; 在前面我們已經講了有十幾個Linux的基礎指令&#xff0c;今天我們再補充幾個常用的基礎指令&#xff0c;為后面的學習做準備 。 目錄 前言&#xff1a; 一、兩個與時間相關的指令 1.date指令 演示 &#xff1a; 時間戳 設置時間 2、cal指令 演示&#x…

基于SiamFC的紅外目標跟蹤

基于SiamFC的紅外目標跟蹤 1,背景與原理2,SiamFC跟蹤方法概述2.1 核心思想2.2 算法優勢3,基于SiamFC的紅外跟蹤代碼詳解3.1 網絡定義與交叉相關模塊3.2 SiamFC 跟蹤器實現3.3 主程序:利用 OpenCV 實現視頻跟蹤4,總結與展望在紅外監控、無人機防御以及低光照場景中,紅外圖…

Odoo 部署本地 把現時的excel計算表格部署上odoo 教程

要將現有的 Excel 計算表格部署到 Odoo 平臺上&#xff0c;您可以按照以下步驟進行操作&#xff1a; 將 Excel 表格中的數據轉移到 Odoo 模塊中&#xff1a;首先&#xff0c;您需要將 Excel 表格中的數據導出為 CSV 格式&#xff0c;然后可以使用 Odoo 的數據導入功能將這些數據…

KWDB創作者計劃—KWDB認知引擎:數據流動架構與時空感知計算的范式突破

引言&#xff1a;數據智能的第三范式 在數字化轉型進入深水區的2025年&#xff0c;企業數據系統正面臨三重悖論&#xff1a;數據規模指數級增長與實時決策需求之間的矛盾、多模態數據孤島與業務連續性要求之間的沖突、靜態存儲范式與動態場景適配之間的鴻溝。KWDB&#xff08;K…

C語言 數據結構 【棧】動態模擬實現

引言 動態模擬實現棧的各個接口 一、棧的概念與結構 棧&#xff1a;一種特殊的線性表&#xff0c;其只允許在固定的一端進行插入和刪除元素操作。進行數據插入和刪除操作的一端稱為棧頂&#xff0c;另一端稱為棧底。棧中的數據元素遵守后進先出LIFO&#xff08;LastInFirstOut…

Python itertools模塊的groupby函數介紹

itertools.groupby 是 Python 標準庫 itertools 模塊中的一個函數&#xff0c;它的主要功能是對可迭代對象中相鄰的相同元素進行分組。 itertools.groupby(iterable, keyNone) 函數 作用&#xff1a; 將連續的&#xff08;相鄰的&#xff09;相同元素分組&#xff0c;返回 (…

Python實例題:使用Python生成分形圖片

目錄 Python實例題 題目 題目分析 需求理解 關鍵知識點 實現思路分析 代碼實現 代碼解釋 mandelbrot 函數&#xff1a; 設置復平面區域和圖像參數&#xff1a; 計算分形數據&#xff1a; 繪圖展示&#xff1a; 運行思路 Python實例題 題目 使用Python生成分形圖…

系統編程1(進程的概念與原理)

進程的概念與原理 計算機組成部分一般遵循馮諾依曼結構&#xff0c;也就是由控制器、運算器、存儲器、輸入設備、輸出設備五個部分組成。 ? 程序的編譯 一般在編寫出程序之后&#xff0c;并不能直接運行&#xff0c;而是需要把程序通過編譯器進行編譯&#xff0c;生成可執行…

《Vue Router實戰教程》5.嵌套路由

歡迎觀看《Vue Router 實戰&#xff08;第4版&#xff09;》視頻課程 嵌套路由 一些應用程序的 UI 由多層嵌套的組件組成。在這種情況下&#xff0c;URL 的片段通常對應于特定的嵌套組件結構&#xff0c;例如&#xff1a; 通過 Vue Router&#xff0c;你可以使用嵌套路由配置…

使用Python解決Logistic方程

引言 在數學和計算機科學中,Logistic 方程是描述人口增長、傳播過程等現象的一種常見模型。它通常用于表示一種有限資源下的增長過程,比如動物種群、疾病傳播等。本文將帶領大家通過 Python 實現 Logistic 方程的求解,幫助你更好地理解這一經典數學模型。 1.什么是 Logist…

《從零搭建Vue3項目實戰》(AI輔助搭建Vue3+ElemntPlus后臺管理項目)零基礎入門系列第十二篇(完結篇):數據統計功能實現

&#x1f91f;致敬讀者 &#x1f7e9;感謝閱讀&#x1f7e6;笑口常開&#x1f7ea;生日快樂?早點睡覺 &#x1f4d8;博主相關 &#x1f7e7;博主信息&#x1f7e8;博客首頁&#x1f7eb;專欄推薦&#x1f7e5;活動信息 文章目錄 《從零搭建Vue3項目實戰》&#xff08;AI輔助…

研究嵌入式軟件架構時遇到的初始化堆棧溢出問題

文章目錄 2025年4月10日新增分析PC寄存器指針值排查問題map文件設計到的知識點1. **.bss 段&#xff08;Block Started by Symbol&#xff09;**2. **.data 段**3. **.text 段**4. **.heap 段**5. **.stack 段**6. **.rodata 段&#xff08;只讀數據段&#xff09;**7. **.init…