React中 點擊事件寫法 的注意(this、箭頭函數)

?

目錄

?1、錯誤寫法?:onClick={this.acceptAlls()}

?2、正確寫法?:onClick={this.acceptAlls}(不帶括號)

總結

方案1:構造函數綁定

方案2:箭頭函數包裝方法(更簡潔)

方案3:直接綁定 + 參數傳遞

方案的關鍵區別說明


在寫代碼時,看到別人寫的點擊事件,大家寫法都不太一樣,到底有什么需要注意的呢?

-----------需要注意 ?正確的綁定方式? 和 ?事件觸發時機

?1、錯誤寫法?:onClick={this.acceptAlls()}

?????原因:

  • 這樣寫會?立即執行??acceptAlls?函數,而不是在點擊時執行。
  • 括號?()?表示函數調用
  • 組件渲染時就會執行?acceptAlls
  • onClick?實際上接收到的是?acceptAlls?的返回值(這里是?undefined),而不是函數本身
// 例如:錯誤的寫法
class MyComponent extends React.Component {acceptAlls = () => {console.log("執行邏輯", this.props); //};
}<Button onClick={this.acceptAlls() }>保存</Button>

?2、正確寫法?:onClick={this.acceptAlls}(不帶括號)

// 改正后的:
class MyComponent extends React.Component {acceptAlls = () => {console.log("執行邏輯", this.props); //};
}<Button onClick={this.acceptAlls}>保存</Button>

總結

在 React 中,onClick?需要接收一個?函數引用?(即函數本身),而不是函數的執行結果

  • ?onClick={函數}?:傳遞函數引用,點擊時執行。
  • ?onClick={函數()}?:立即執行函數,傳遞返回值(通常是無效的)。
  • 這里?() => {...}?創建了一個新函數,點擊時才會調用?acceptAlls(id)

方案1:構造函數綁定

<Button onClick={this.acceptAlls }>保存</Button>

上述寫法的前提需要:this指向要明確(要么手動綁定、要么寫成箭頭函數)

class MyComponent extends React.Component {// 方式1:構造函數中綁定constructor(props) {super(props);this.acceptAlls = this.acceptAlls.bind(this);  // !!!!!!}acceptAlls() {console.log("執行邏輯", this.props); // this 正確指向組件實例}<Button onClick={this.acceptAlls}>直接確認</Button >
}

class MyComponent extends React.Component {// 方式2:箭頭函數自動綁定 thisacceptAlls = () => {console.log("執行邏輯", this.props); // this 始終正確};<Button onClick={this.acceptAlls}>直接確認</Button >
}

class MyComponent extends React.Component {constructor(props) {super(props);this.acceptAlls = this.acceptAlls.bind(this); // ? 正確綁定}acceptAlls(id) {console.log("執行ID:", id, this.props); // ? this 正確}render() {return (<Button onClick={() => this.acceptAlls(item.id)}>確認</Button>// ? 箭頭函數傳參 + 已綁定的方法);}
}

方案2:箭頭函數包裝方法(更簡潔)

class MyComponent extends React.Component {// 箭頭函數自動綁定 thisacceptAlls = (id) => {console.log("確認操作", id, this.props);};render() {return (<div>{/* 無參數 */}<Button onClick={this.acceptAlls}>直接確認</Button >{/* 有參數 */}// 需要傳遞額外參數時(如 id):<Button onClick={() => this.acceptAlls(item.id)}>確認</Button></div>);}
}

注意:

  • 箭頭函數一定的性能影響?,每次渲染都會創建新函數,可能影響性能(在循環或純組件中慎用)?

方案3:直接綁定 + 參數傳遞

class MyComponent extends React.Component {constructor(props) {super(props);this.acceptAlls = this.acceptAlls.bind(this);}acceptAlls(id) { /*...*/ }render() {return (<Button onClick={this.acceptAlls.bind(this, item.id)}>確認</Button>// ? bind 直接綁定參數(注意性能影響));}
}

方案的關鍵區別說明

方案this?綁定參數傳遞性能影響
構造函數綁定手動綁定需箭頭函數傳參最優
箭頭函數方法自動綁定可箭頭函數傳參較優
直接bind傳參手動綁定bind直接傳參較差(每次渲染新建函數)

最佳實踐建議

  1. ?優先使用方案2(箭頭函數方法)?:既解決this問題,又保持代碼簡潔
  2. ?需要兼容舊代碼時用方案1?:顯式綁定更易理解
  3. ?避免在render中直接bind?(方案3):可能引發性能問題

?

?

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

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

相關文章

【路由交換方向IE認證】BGP選路原則之Weight屬性

文章目錄 一、路由器BGP路由的處理過程控制平面和轉發平面選路工具 二、BGP的選路順序選路的前提選路順序 三、Wight屬性選路原則規則9與規則11的潛移默化使用Weight值進行選路直接更改Weight值進行選路配合使用route-map進行選路 四、BGP鄰居建立配置 一、路由器BGP路由的處理…

Missashe考研日記-day20

Missashe考研日記-day20 1 高數 學習時間&#xff1a;2h30min學習內容&#xff1a; 今天當然是刷題啦&#xff0c;做不等式的證明板塊的真題&#xff0c;證明題懂的都懂&#xff0c;難起來是真的一點思路都沒有&#xff0c;這個板塊還沒做完&#xff0c;做完再總結題型。 2…

了解JVM

一.JVM概述 1.JVM的作用 ?把字節碼編譯為機器碼去執行,負責把字節碼裝載到虛擬機中 ?現在的 JVM 不僅可以執行 java 字節碼文件,還可以執行其他語言編譯后的字節碼文件,是一個跨語言平臺 2.JVM的組成部分 類加載器&#xff08;ClassLoader&#xff09;運行時數據區&#x…

LeetCode LCR157 套餐內商品的排列順序

生成字符串的全部排列&#xff08;去重&#xff09;&#xff1a;從問題到解決方案的完整解析 問題背景 在編程和算法設計中&#xff0c;生成字符串的所有排列是一個經典問題。它不僅出現在算法競賽中&#xff0c;也在實際開發中有著廣泛的應用&#xff0c;比如生成所有可能的…

pgsql:關聯查詢union(并集)、except(差集)、intersect(交集)

pgsql:關聯查詢union(并集)、except(差集)、intersect(交集)_pgsql except-CSDN博客

微信小程序中使用ECharts 并且動態設置數據

項目下載地址 GitHub 地址 https://github.com/ecomfe/echarts-for-weixin 將當前文件夾里的內容拷貝到項目中 目錄&#xff1a; json: {"usingComponents": {"ec-canvas": "../components/ec-canvas/ec-canvas"} }wxml&#xff1a; <ec…

RV1126 人臉識別門禁系統解決方案

1. 方案簡介 本方案為類人臉門禁機的產品級解決方案,已為用戶構建一個帶調度框架的UI應用工程;準備好我司的easyeai-api鏈接調用;準備好UI的開發環境。具備低模塊耦合度的特點。其目的在于方便用戶快速拓展自定義的業務功能模塊,以及快速更換UI皮膚。 2. 快速上手 2.1 開…

深度學習ResNet模型提取影響特征

大家好&#xff0c;我是帶我去滑雪&#xff01; 影像組學作為近年來醫學影像分析領域的重要研究方向&#xff0c;致力于通過從醫學圖像中高通量提取大量定量特征&#xff0c;以輔助疾病診斷、分型、預后評估及治療反應預測。這些影像特征涵蓋了形狀、紋理、灰度統計及波形變換等…

DeepSeek 接入 Word 完整教程

一、前期準備 1.1 注冊并獲取 API 密鑰 訪問 DeepSeek 平臺&#xff1a; 打開瀏覽器&#xff0c;訪問 DeepSeek 官方網站&#xff08;或您使用的相應平臺&#xff09;。注冊并登錄您的賬戶。 創建 API 密鑰&#xff1a; 在用戶控制面板中&#xff0c;找到“API Keys”或“API…

驅動開發硬核特訓 · Day 7:深入掌握 Linux 驅動資源管理機制(Resource Management)

&#x1f50d; B站相應的視屏教程&#xff1a; &#x1f4cc; 內核&#xff1a;博文視頻 - 總線驅動模型實戰全解析 —— 以 PCA9450 PMIC 為例 敬請關注&#xff0c;記得標為原始粉絲。 &#x1f6a9; 在 Linux 驅動開發中&#xff0c;資源管理機制決定了驅動的穩定性與可靠性…

什么是TensorFlow?

TensorFlow 是由 Google Brain 團隊開發的開源機器學習框架&#xff0c;被廣泛應用于深度學習和人工智能領域。它的基本概念包括&#xff1a; 1. 張量&#xff08;Tensor&#xff09;&#xff1a;在 TensorFlow 中&#xff0c;數據以張量的形式進行處理。張量是多維數組的泛化…

【ChCore Lab 01】Bomb Lab 拆炸彈實驗(ARM匯編逆向工程)

文章目錄 1. 前言2. 實驗代碼版本問題3. 關于使用問題4. 宏觀分析5. read_line 函數介紹6. phase_0 函數6.1. read_int 函數6.2. 回到 phase_0 函數繼續分析6.3. 驗證結果 7. phase_1 函數7.2. 驗證結果 8. phase_2 函數8.1. read_8_numbers 函數8.2. 回到 phase_2 函數繼續分析…

《Vue Router實戰教程》20.路由懶加載

歡迎觀看《Vue Router 實戰&#xff08;第4版&#xff09;》視頻課程 路由懶加載 當打包構建應用時&#xff0c;JavaScript 包會變得非常大&#xff0c;影響頁面加載。如果我們能把不同路由對應的組件分割成不同的代碼塊&#xff0c;然后當路由被訪問的時候才加載對應組件&am…

docker 多主機容器組網

一、服務器A 1、初始化Swarm集群&#xff08;管理節點&#xff09; docker swarm init --advertise-addr 主節點ip 2、獲取工作節點??加入Swarm集群所需的Token 和完整命令 docker swarm join-token worker 3、創建Overlay網絡 docker network create -d overlay --subnet…

rancher 解決拉取dashboard-shell鏡像失敗的問題

問題背景 在 Kubernetes 集群中部署 Rancher 后&#xff0c;點擊右上角的 "Shell" 按鈕時&#xff0c;Rancher 會動態創建一個 dashboard-shell-xxxxx Pod&#xff0c;用于提供 Web 終端功能。然而&#xff0c;由于默認鏡像 rancher/shell:v0.1.21 托管在 Docker Hu…

OpenCV day2

Matplotlib相關知識 Matplotlib相關操作&#xff1a; import numpy as np from matplotlib import pyplot as pltx np.linspace(0, 2 * np.pi, 100) y1 np.sin(x) y2 np.cos(x)# 使用紅色虛線&#xff0c;圓點標記&#xff0c;線寬1.5&#xff0c;標記大小為6繪制sin plt.p…

【網絡安全】通過 JS 尋找接口實現權限突破

未經許可,不得轉載。 本文所述所有風險點均已修復。 文章目錄 引言正文引言 以下些漏洞已被起亞方面修復;起亞方面確認,這些漏洞從未被惡意利用過。 2024年6月11日,我們發現起亞汽車存在一系列嚴重安全漏洞,攻擊者僅憑車牌號即可遠程控制車輛的核心功能。該攻擊不需要接觸…

LabVIEW 發電機勵磁系統監測與診斷

在現代工業體系中&#xff0c;發電機作為關鍵的電能轉換設備&#xff0c;其穩定運行對于電力供應的可靠性起著決定性作用。而勵磁系統作為發電機的核心控制部分&#xff0c;直接影響著發電機的性能和電力系統的穩定性。一旦勵磁系統出現故障&#xff0c;可能引發發電機電壓波動…

MacOS紅隊常用攻擊命令

MacOS紅隊常用攻擊命令 1.自動化武器2.系統信息3.服務 & 內核信息4.快捷命令5.網絡相關6.brew相關 / 軟件包相關7.高權限命令8.創建一個管理員權限的后門用戶 1.自動化武器 1、linPEAS LinPEAS 是一個腳本&#xff0c;用于在 Linux/Unix/MacOS 主機上搜索提權路徑 2、me…

【數據結構_8】棧和隊列

一、反向輸出鏈表元素 Ⅰ使用遞歸進行反向輸出 package stack; public class Test2 {static class Node{public String val;public Node next;//構造方法public Node(String val) {this.val val;this.next null;}}//利用遞歸來反向輸出鏈表public static void reverse(Nod…