04-React中綁定this并給函數傳參的幾種方式

    • 前言
    • 綁定 this 的方式一:bind()
    • 綁定 this 并給函數傳參 的方式二:構造函數里設置 bind()
    • 綁定 this 并給函數傳參 的方式三:箭頭函數【薦】

前言

我們先來看下面這段代碼:

components/MyComponent.jsx

import React from "react";export default class MyComponent extends React.Component {constructor(props) {super(props);this.state = {msg: "這是 MyComponent 組件 默認的msg"};}render() {return (<div><h1>綁定This并傳參</h1><input type="button" value="綁定this并傳參" onClick={this.changeMsg} /><h3>{this.state.msg}</h3></div>);}changeMsg() {// 注意:這里的changeMsg()只是一個普通方法。因此,在觸發的時候,這里的 this 是 undefinedconsole.log(this); // 打印結果:undefinedthis.setState({msg: "設置 msg 為新的值"});}
}

上面的代碼中,點擊按鈕,執行 changeMsg() 方法,嘗試修改 this.state.msg 的值。但是,這個方法執行的時候,是會報錯的:

Uncaught TypeError: Cannot read property 'setState' of null

而且,打印this的結果也是 undefined。這是為啥呢?因為這里的 this 并不是指向 MyComponent 組件本身。

那如何讓 changeMsg() 方法里面的 this,指向MyComponent 組件呢?辦法總是有的,比如說,將changeMsg() 修改為箭頭函數:

  changeMsg = () => {console.log(this); // 打印結果:MyComponent 組件this.setState({msg: "設置 msg 為新的值"});};

那么,除了箭頭函數可以 綁定 this,還有沒有其他的方式呢?我們接下來講一講。

綁定 this 的方式一:bind()

代碼舉例:

import React from "react";export default class MyComponent extends React.Component {constructor(props) {super(props);this.state = {msg: "這是 MyComponent 組件 默認的msg"};}render() {return (<div><h1>綁定This并傳參</h1>{/* bind 的作用:為前面的函數,修改函數內部的 this 指向。讓 函數內部的this,指向 bind 參數列表中的 第一個參數 */}<inputtype="button"value="綁定this并傳參"onClick={this.changeMsg1.bind(this)}/><h3>{this.state.msg}</h3></div>);}changeMsg1() {this.setState({msg: "設置 msg 為新的值"});}
}

上方代碼中,我們為什么用 bind(),而不是用 call/apply 呢?因為 bind() 并不會立即調用,正是我們需要的。

注意:bind 中的第一個參數,是用來修改 this 指向的。第一個參數后面的所有參數,都將作為函數的參數傳遞進去。

我們來看看通過 bind() 是怎么傳參的。

通過 bind() 綁定this,并給函數傳參

import React from "react";export default class MyComponent extends React.Component {constructor(props) {super(props);this.state = {msg: "這是 MyComponent 組件 默認的msg"};}render() {return (<div><h1>綁定This并傳參</h1>{/* bind 的作用:為前面的函數,修改函數內部的 this 指向。讓 函數內部的this,指向 bind 參數列表中的 第一個參數 */}<input type="button" value="綁定this并傳參" onClick={this.changeMsg1.bind(this, "編程的一拳超人啊", "編程的一拳超人啊")} /><h3>{this.state.msg}</h3></div>);}changeMsg1(arg1, arg2) {this.setState({msg: "設置 msg 為新的值" + arg1 + arg2});}
}

綁定 this 并給函數傳參 的方式二:構造函數里設置 bind()

我們知道,構造函數中的 this 本身就是指向組件的實例的,所以,我們可以在這里做一些事情。

代碼舉例:

import React from "react";export default class MyComponent extends React.Component {constructor(props) {super(props);this.state = {msg: "這是 MyComponent 組件 默認的msg"};// 綁定 this 并給函數傳參的方式2: 在構造函數中綁定并傳參// 注意:當一個函數調用 bind 改變了this指向后,bind 函數調用的結果,有一個【返回值】,這個值,就是被改變this指向后的函數的引用。// 也就是說: bind 不會修改 原函數的 this 指向,而是改變了 “函數拷貝”的this指向。this.changeMsg2 = this.changeMsg2.bind(this, "編程的一拳超人恩", "編程的一拳超人恩");}render() {return (<div><h1>綁定This并傳參</h1><input type="button" value="綁定this并傳參" onClick={this.changeMsg2} /><h3>{this.state.msg}</h3></div>);}changeMsg2(arg1, arg2) {this.setState({msg: "設置 msg 為新的值" + arg1 + arg2});}
}

上方代碼中,需要注意的是:當一個函數調用 bind 改變了this指向后,bind 函數調用的結果,有一個【返回值】,這個值,就是被改變this指向后的函數的引用。也就是說: bind 不會修改 原函數的 this 指向,而是改變了 “函數拷貝”的this指向。

綁定 this 并給函數傳參 的方式三:箭頭函數【薦】

第三種方式用得最多。

代碼舉例:

import React from "react";export default class MyComponent extends React.Component {constructor(props) {super(props);this.state = {msg: "這是 MyComponent 組件 默認的msg"};}render() {return (<div><h1>綁定This并傳參</h1><inputtype="button"value="綁定this并傳參"onClick={() => {this.changeMsg3("編程的一拳超人3", "編程的一拳超人3");}}/><h3>{this.state.msg}</h3></div>);}changeMsg3 = (arg1, arg2) => {// console.log(this);// 注意:這里的方式,是一個普通方法,因此,在觸發的時候,這里的 this 是 undefinedthis.setState({msg: "綁定this并傳參的方式3:" + arg1 + arg2});};
}

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

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

相關文章

Docker拉取不兼容的鏡像解決辦法

錯誤提示如下&#xff1a; WARNING: The requested images platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested295ef35cfefe0dce6904e017e89218695d9a9c092b45496218f4476357be4f9c 這個警告表明你…

android14 未充電狀態電量低于15%彈框提示 10%直接關機

上層接收電量變化廣播&#xff0c;添加未充電判斷&#xff0c;做出彈框或關機動作 SystemUI\src\com\android\systemui\power\PowerUI.java Overridepublic void onReceive(Context context, Intent intent) {String action intent.getAction();if (PowerManager.ACTION_POWE…

ASP.NET Core 中 Kestrel 的應用及在前后端分離項目中的角色

目錄 一、Kestrel 基礎&#xff1a;輕量級且高性能的 Web 服務器 二、前后端分離項目架構&#xff1a;Vue、.NET Core API、Nginx 與 Kestrel 2.1 交互流程圖 2.2 流程詳解 三、Kestrel 在架構中的核心作用 四、launchSettings.json 與 Kestrel 配置的關系及底層機制 4.1…

Kotlin 退出循環總結

文章目錄 Kotlin 退出循環總結for循環forEach()嵌套for循環lambda函數inline函數 Kotlin 退出循環總結 for循環 for ((index, value) in list.withIndex()) {if (value "c") {break // 退出循環}println("$index - $value") }// 0 - a // 1 - bfo…

再看C語言

目錄 與Java的差異化 編程范式 跨平臺 編譯過程 包管理 基本類型 內存結構 重點掌握 進制、字節與計算 指針 結構體 關鍵詞 動態內存 模塊化 高級特性 動態鏈接 虛擬內存 打包編譯 并發編程 現在需要參與到存儲軟件開發工作&#xff0c;存儲層比較接近OS系統…

機器學習入門 | 訓練、推理與其他機器學習活動(預處理、測試與評估)

在訓練階段&#xff0c;訓練算法通過優化目標/損失函數在訓練數據集上的表現&#xff0c;不斷更新模型參數θ。在監督學習場景中&#xff0c;訓練數據集由輸入-標簽對&#xff08;真實輸出值&#xff09;組成。目標函數應當獎勵模型根據訓練輸入成功預測真實輸出的行為&#xf…

Node.js特訓專欄-實戰進階:11. Redis緩存策略與應用場景

&#x1f525; 歡迎來到 Node.js 實戰專欄&#xff01;在這里&#xff0c;每一行代碼都是解鎖高性能應用的鑰匙&#xff0c;讓我們一起開啟 Node.js 的奇妙開發之旅&#xff01; Node.js 特訓專欄主頁 專欄內容規劃詳情 Redis 緩存策略與應用場景&#xff1a;從理論到實戰的高…

【stm32】HAL庫開發——Cube配置基本定時器

目錄 一、Cube配置基本定時器 1.定時器CubeMX配置介紹 2.定時器中斷控制LED 3.定時器常用函數 4.定時器從模式&#xff08;Reset Mode&#xff09; 5.定時器的從模式&#xff08;Gated Mode&#xff09; 6.定時器的編碼器接口 一、Cube配置基本定時器 1.定時器CubeMX配置…

nginx反向代理后端服務restful及token處理

#user nobody; worker_processes 1;#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024; } #代理mysql服務 stream {upstream mysql_backend {server 192.168…

正確理解Cola StateMachine不內置事務管理機制

? 正確理解&#xff1a;Cola StateMachine 并非“不支持”事務一致性&#xff0c;而是“不內置”事務管理機制 因為&#xff1a; Cola StateMachine 是輕量級、無狀態、不依賴 Spring 的框架&#xff0c;它本身 不綁定任何事務上下文。它不像 Spring StateMachine 那樣自動與…

AudioTrack使用

** AudioTrack ** AudioTrack 是 Android 音頻系統中的核心類&#xff0c;用于播放原始音頻數據&#xff08;PCM&#xff09;或壓縮音頻&#xff08;如 MP3、AAC&#xff09;。它提供了低級別的音頻播放控制&#xff0c;適合需要精細管理的場景&#xff08;如游戲音效、實時音…

解密:MySQL 的常見存儲引擎

在數據庫領域&#xff0c;MySQL 作為一款廣受歡迎的關系型數據庫管理系統&#xff0c;提供了多種存儲引擎以滿足不同應用場景的需求。每種存儲引擎都有其獨特的特性、優勢和適用場景。本文將深入探討 MySQL 中幾種常見的存儲引擎&#xff0c;包括 InnoDB、MyISAM、MEMORY 和 AR…

qt和qtcreator版本關系

實例展示&#xff1a; 如圖所示的qtcreator是使用qt5.15安裝過程選擇勾選了qtcreator 14.0.2&#xff0c;安裝完成qtcreator版本信息&#xff1a; 安裝過程中選擇了這些構件kits&#xff0c;會自動識別到&#xff1a; 使用qt5.9.9另外安裝的kits&#xff0c;需要手動設置才能識…

2個任務同時提交到YARN后2個都卡住(CDH)

文章目錄 問題描述解決方案1、增加資源2、調整ApplicationMaster資源3、關閉YARN調度器的資源搶占4、不使用公平調度器 問題描述 在CDH集群上&#xff0c;同時提交2個任務到YARN后&#xff0c;2個任務都卡住 解決方案 1、增加資源 增加服務器的內存和CPU 2、調整Applicatio…

web3區塊鏈-ETH以太坊

一. 以太坊概述 以太坊&#xff08;Ethereum&#xff09;作為區塊鏈技術的代表性項目之一&#xff0c;自2015年發布以來&#xff0c;迅速成為全球區塊鏈行業的核心基礎設施。相比比特幣&#xff0c;以太坊不僅支持點對點的價值轉移&#xff0c;還引入了智能合約&#xff0c;使…

【智能協同云圖庫】智能協同云圖庫第二彈:用戶管理系統后端設計與接口開發

用戶管理系統 一、需求分析 對于用戶模塊&#xff0c;通常要具有下列功能&#xff1a; 二、方案設計 &#xff08;一&#xff09;庫表設計 實現用戶模塊的難度不大&#xff0c;在方案設計階段&#xff0c;我們需要確認以下內容&#xff1a; 庫表設計用戶登錄流程如何對用戶權限…

閑庭信步使用SV搭建圖像測試平臺:第十三課——談談SV的數據類型

&#xff08;本系列只需要modelsim即可完成數字圖像的處理&#xff0c;每個工程都搭建了全自動化的仿真環境&#xff0c;只需要雙擊top_tb.bat文件就可以完成整個的仿真&#xff0c;大大降低了初學者的門檻&#xff01;&#xff01;&#xff01;&#xff01;如需要該系列的工程…

前端進階之路-從傳統前端到VUE-JS(第一期-VUE-JS環境配置)(Node-JS環境配置)(Node-JS/npm換源)

經過前面的傳統前端開發學習后&#xff0c;我們接下來進行前端的VUE-JS框架學習&#xff08;寫這篇文章的時候VUE-JS最新版是VUE3&#xff0c;所以默認為VUE3即可&#xff09; 首先&#xff0c;我們要配置Node-JS環境&#xff0c;雖然我們還不學習Node-JS但是Node-JS可以快速配…

Requests源碼分析:面試考察角度梳理

簡單描述執行流程 ?? Q:能簡單描述一下發送一個requests.get(url)請求時,在requests庫內部的主要執行流程嗎?(從調用get方法到收到響應) 入口委托: get() 方法內部調用 requests.request(GET, url)。Session 接管: request() 方法會獲取或隱式創建一個 Session 對象,并…

航天VR賦能,無人機總測實驗艙開啟高效新篇?

(一)沉浸式培訓體驗? 在傳統的無人機培訓中&#xff0c;操作人員主要通過理論學習和簡單的模擬操作來掌握技能。但這種方式存在很大局限性&#xff0c;難以讓操作人員真正感受無人機在復雜環境下的運行狀態。而航天 VR 技術引入到 VR 無人機總測實驗艙后&#xff0c;徹底改變了…