React組件中的this指向問題

在 React 組件中,函數定義方式影響this指向的核心原因是箭頭函數與普通函數的作用域綁定規則不同,具體差異如下:?

1. 普通函數(function定義)需要手動bind(this)的原因?

當用function在組件內定義方法時:

class MyComponent extends React.Component {handleClick() {console.log(this); // 若未綁定,此處this為undefined}render() {return <button onClick={this.handleClick}>點擊</button>;}
}

函數獨立于實例存在: handleClick是組件類的方法,但其this指向調用時的上下文,而非組件實例。?
事件回調中的this丟失:handleClick作為事件回調(如onClick)傳遞時,實際調用時脫離了組件實例,this會默認指向undefined(嚴格模式下)。?
bind(this)的作用: 通過bind強制將函數的this綁定到組件實例,確保調用時this能訪問組件的stateprops等屬性:

constructor() {super();this.handleClick = this.handleClick.bind(this); // 綁定后this指向實例
}

2. 箭頭函數不需要手動綁定的原因?

箭頭函數的特性決定了其this指向是定義時的上下文,而非調用時:

class MyComponent extends React.Component {handleClick = () => {console.log(this); // 此處this直接指向組件實例}render() {return <button onClick={this.handleClick}>點擊</button>;}
}

詞法作用域綁定: 箭頭函數沒有自己的this,其this繼承自定義時所在的作用域(這里是組件實例的上下文)。?
與組件實例綁定: 在類組件中,箭頭函數作為類屬性定義時,this會自動綁定到當前組件實例,無論如何傳遞或調用,this都不會丟失。?
無需額外bind: 因為this在定義時已固定,作為事件回調傳遞時,this依然指向組件實例,可直接訪問this.statethis.props

3. 本質區別:this的綁定時機

函數類型this指向規則綁定時機React 組件中的表現
普通函數由調用方式決定(誰調用指向誰)運行時綁定需手動bind(this)才能指向組件實例
箭頭函數繼承定義時的上下文(詞法作用域)定義時綁定自動指向組件實例,無需額外綁定

4. 與call/apply的關聯(呼應之前的call實現)?

普通函數this可通過bind(本質是返回一個this固定的新函數)、call/apply(立即調用時指定this)修改,這也是手動綁定的底層原理。?
箭頭函數this無法被bindcall/apply修改,因為其this在定義時已固化,這也是箭頭函數無需手動綁定的根本原因。

另,自己手動實現bind/call/apply函數,可參考這篇
手動實現 JavaScript 的 call、apply 和 bind 方法

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

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

相關文章

Vue 項目中的組件引用如何實現,依賴組件間的數據功能交互及示例演示

在 Vue 項目中&#xff0c;組件間的引用與數據交互是核心功能之一。以下是組件引用和數據交互的詳細實現方式及示例&#xff1a;一、組件引用方式 1. 基本組件引用 局部注冊&#xff1a;在父組件中按需引入子組件并注冊。 // ParentComponent.vue import ChildComponent from .…

? 使用 Flask 實現頭像文件上傳與加載功能

文章目錄&#x1f9f1; 技術棧&#x1f5c2;? 項目結構與配置&#x1f510; 用戶身份校驗邏輯&#x1f4e4; 頭像上傳接口&#xff1a;/file/avatar/upload&#x1f4e5; 加載頭像接口&#xff1a;/file/avatar/load/<filename>&#x1f9ea; 示例請求&#xff08;使用 …

去除視頻字幕 5: 使用 ProPainter, 記錄探索過程

使用 ProPainter 去除視頻上的字幕&#xff0c;效果演示&#xff08;比之前好多了。&#xff09;。 1. 項目目標 去除視頻 (bear.webm) 中的硬字幕。 2. 初始嘗試與關鍵失敗&#xff1a;IOPaint 方法: 使用 IOPaint&#xff08;一個圖像修復工具&#xff09;配合 PaddleOCR 逐…

JavaScript HTTP 請求:從老古董到新潮流

前端開發離不開跟后端打交道&#xff0c;HTTP 請求就是這座橋梁。JavaScript 提供了好幾種方式來發請求&#xff0c;從老牌的 XMLHttpRequest (XHR) 到現代的 Fetch API&#xff0c;再到各種好用的第三方庫&#xff08;像 Axios、Ky、Superagent&#xff09;。咱們一個一個聊清…

Windows10系統使用Cmake4.1.0構建工具+Visual Studio2022編譯Opencv4.11教程

安裝提示 后續安裝本Cmake和Opencv版本及以上都可以。Microsoft Visual Studio2022已默認安裝&#xff0c;沒有安裝給出教程鏈接。 一、Cmake4.1.0下載 1.官網下載&#xff1a;https://cmake.org/download/&#xff0c;找到cmake-4.1.0-rc3-windows-x86_64.zip版本 2.壓縮包…

【性能測試】Jmeter+Grafana+InfluxDB+Prometheus Windows安裝部署教程

一、工具作用與整體架構 1.1 各工具核心作用 工具作用描述關鍵特性Jmeter性能測試工具&#xff0c;模擬多用戶并發請求&#xff0c;生成測試數據支持HTTP/HTTPS、數據庫等多種協議&#xff0c;可自定義測試場景InfluxDB時序數據庫&#xff0c;專門存儲時間序列數據&#xff0…

【Kubernetes】使用Deployment進行的資源調度,資源清理,伸縮與更新管控

Kubernetes Deployment 實戰&#xff1a;從資源清理到伸縮與更新管控 一、基礎準備&#xff1a;清理閑置 ReplicaSet 在使用 Deployment 時&#xff0c;每次更新都會生成新的 ReplicaSet&#xff08;簡稱 RS&#xff09;&#xff0c;舊的 RS 會被保留但設置為 DESIRED0。這些閑…

stm32使用USB虛擬串口,因電腦缺少官方驅動而識別失敗(全系列32單片機可用)

驅動下載地址 官網地址&#xff1a;https://www.st.com/en/development-tools/stsw-stm32102.html

枚舉中間位置基礎篇

參考資料來源靈神在力扣所發的題單&#xff0c;僅供分享學習筆記和記錄&#xff0c;無商業用途。 核心思路&#xff1a; 一&#xff1a;直接直接用數據結構記錄需要的數據&#xff0c;在枚舉右&#xff0c;維護左的循環中&#xff0c;刪除當前位置的元素即可達成一樣效果 二…

企業選擇將服務器放在IDC機房托管的優勢

在服務器作為數據存儲和傳輸的核心設備的社會環境中&#xff0c;服務器的穩定性和安全性會直接影響到企業業務的連續性和用戶的滿意程度&#xff0c;隨著云計算技術和大數據的興起&#xff0c;企業對于服務器的需求也在日益增加&#xff0c;而如何高效、安全的管理服務器則是各…

自動化UI測試工具TestComplete的AI雙引擎:即時數據集 + 自愈測試

隨著敏捷開發和持續交付模式的普及&#xff0c;傳統的軟件測試方法正面臨著前所未有的挑戰。測試團隊在追求快速迭代的同時&#xff0c;往往陷入測試數據準備和測試維護的泥潭&#xff0c;嚴重制約了交付效率和質量保障能力。 TestComplete作為業界領先的自動化測試工具&#…

用KNN實現手寫數字識別:基于 OpenCV 和 scikit-learn 的實戰教學 (超級超級超級簡單)

用KNN實現手寫數字識別&#xff1a;基于 OpenCV 和 scikit-learn 的實戰教學在這篇文章中&#xff0c;我們將使用 KNN&#xff08;K-Nearest Neighbors&#xff09;算法對手寫數字進行分類識別。我們會用 OpenCV 讀取圖像并預處理數據&#xff0c;用 scikit-learn 構建并訓練模…

數據結構自學Day15 -- 非比較排序--計數排序

一、計數排序&#xff08;Counting Sort&#xff09;計數排序是一種非比較型的排序算法&#xff0c;它的核心思想是&#xff1a;利用“元素的值”來確定它在結果數組中的位置&#xff0c;通過“統計每個數出現的次數”來完成排序。二、如何實現計數排序&#xff08;核心步驟&am…

k8s的權限

來自博客&#xff1a;25-k8s集群中-RBAC用戶角色資源權限_權限 資源 角色-CSDN博客 一.RBAC概述&#xff08;基于角色的訪問控制&#xff09; 1.圖解 用戶&#xff1a; 1.user 2.serviceAccount 3.Group 用戶角色 1.Role:局部資源角色 2.clusterRole:全局資源角色額 角色綁…

C++ - 仿 RabbitMQ 實現消息隊列--服務端核心模塊實現(三)

目錄 隊列數據管理 代碼實現 測試代碼 綁定信息(交換機-隊列)管理 代碼實現 測試代碼 隊列數據管理 當前隊列數據的管理&#xff0c;本質上是隊列描述信息的管理&#xff0c;描述當前服務器上有哪些隊列。 定義隊列描述數據類 隊列名稱是否持久化標志是否獨占標志是否自…

51c自動駕駛~合集9

自己的原文哦~ https://blog.51cto.com/whaosoft/11627386 #端到端1 說起端到端&#xff0c;每個從業者可能都覺得會是下一代自動駕駛量產方案繞不開的點&#xff01;特斯拉率先吹響了方案更新的號角&#xff0c;無論是完全端到端&#xff0c;還是專注于planner的模…

時間長了忘記jupyter的環境是哪個了

有這些但是忘記是哪個了jupyter kernelspec list查看內核路徑&#xff0c;這個內核是用來告訴jupyter 去哪找內核配置的到這個路徑下打開json文件查看使用的python環境從而確定是哪個conda環境為jupyter使用的python環境jupyter的工作原理&#xff1a;在創建conda環境后會安裝j…

PYTHON從入門到實踐-15數據可視化

數據可視化是數據分析中不可或缺的一環&#xff0c;它能夠將抽象的數據轉化為直觀的圖形&#xff0c;幫助我們更好地理解數據特征和發現潛在規律。本文將介紹如何使用Python中的Matplotlib和Plotly庫進行數據可視化&#xff0c;并通過擲骰子的概率模擬案例展示可視化的實際應用…

Spring IOC 容器 **默認注冊 Bean** 的 8 條規則

Spring IOC 容器 默認注冊 Bean 的 8 條規則 &#xff08;Spring Framework 6.x 源碼級總結&#xff09;閱讀提示&#xff1a;把下面 8 條規則背下來&#xff0c;再讀 Spring 源碼時&#xff0c;你會在任何一行代碼里立刻知道「這個 BeanDefinition 是從哪兒來的」。1?? 環境…

29.【.NET8 實戰--孢子記賬--從單體到微服務--轉向微服務】--單體轉微服務--用戶配置服務

用戶配置服務是孢子記賬中最簡單的部分。簡單說&#xff0c;用戶配置服務就是用戶自定義的配置項存儲服務&#xff0c;用于我們的APP根據用戶的配置實現指定的功能。它提供了一個簡單的接口&#xff0c;允許用戶存儲和檢索他們的配置數據。就目前來說&#xff0c;用戶配置只有一…