国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

react 事件函數(shù)中 this 綁定問題

這篇具有很好參考價(jià)值的文章主要介紹了react 事件函數(shù)中 this 綁定問題。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

在使用類方式創(chuàng)建組件時(shí),類中定義一個(gè)函數(shù),并且綁定到元素的點(diǎn)擊事件上,此時(shí)這個(gè)函數(shù)中this指向并不是當(dāng)前這個(gè)組件。

組件代碼如下:

class App extends React.Component {
        // 組件數(shù)據(jù)
        constructor() {
          super()
          this.state = {
            message: 'hello world',
          }
        }
        // 點(diǎn)擊函數(shù)
        btnClick() {
          this.setState({
            message: 'hello react',
          })
        }
		// 渲染函數(shù)
        render() {
          return (
            <div>
              <h2>{this.state.message}</h2>
              <button onClick={this.btnClick}>
	              修改文本
              </button>
            </div>
          )
        }
      }

如上代碼中,點(diǎn)擊修改文本按鈕,會發(fā)生如下報(bào)錯(cuò)

Uncaught TypeError: Cannot read properties of undefined (reading 'setState')

提示 undefined 找不到 setState 方法。

主要原因如下:

  1. 默認(rèn)情況下btnClick內(nèi)的this是綁定的是undefined,熟悉this綁定的應(yīng)該知道,this是綁定運(yùn)行時(shí)調(diào)用這個(gè)函數(shù)的對象,this綁定詳解可以查看:https://www.cnblogs.com/easy1996/p/17954257;
  2. 在正常的DOM操作中,監(jiān)聽點(diǎn)擊,調(diào)用監(jiān)聽函數(shù)的其實(shí)是節(jié)點(diǎn)對象,比如上面的按鈕對象;
  3. 在React中,并不是直接渲染真實(shí)的DOM,render渲染函數(shù)中所編寫的button只是一個(gè)語法糖,最終會編譯成 React.createElement("button", {onClick: this.btnClick});
  4. 同時(shí)會將 btnClick 函數(shù)暴露出來,以 const click = onClick(偽代碼) 的形式;
  5. 當(dāng)點(diǎn)擊事件觸發(fā)時(shí),react執(zhí)行上面的 click 函數(shù),默認(rèn)里面this就是綁定的undefined,相當(dāng)于window中調(diào)用函數(shù)(嚴(yán)格模式下為 undefined);

解決方法:
知道了問題在于 this 的綁定不對,有三種方式解決:

1.給點(diǎn)擊函數(shù)顯式綁定 this

class App extends React.Component {
        constructor() {
          super()
          this.state = {
            message: 'hello world',
          }
          // 位置1.在此處重新給點(diǎn)擊函數(shù)綁定this為組件對象
          this.btnClick = this.btnClick.bind(this)
        }
        btnClick() {
          this.setState({
            message: 'hello react',
          })
        }
        render() {
          return (
            <div>
              <h2>{this.state.message}</h2>
              {/* 位置2.直接在渲染函數(shù)中重新綁定this */}
              <button onClick={this.btnClick.bind(this)}>
	              修改文本
              </button>
            </div>
          )
        }
      }

在上面兩個(gè)位置任選一個(gè)重新綁定 this 為組件對象即可。

2.使用 ES6 class field

class App extends React.Component {
        constructor() {
          super()
          this.state = {
            message: 'hello world',
          }
        }
        // class field
        btnClick = () => {
          this.setState({
            message: 'hello react',
          })
        }
        render() {
          return (
            <div>
              <h2>{this.state.message}</h2>
              <button onClick={this.btnClick}>修改文本</button>
            </div>
          )
        }
      }

上面使用 class field的方式,給 btnClick 賦值一個(gè)箭頭函數(shù),箭頭函數(shù)默認(rèn)綁定當(dāng)前環(huán)境的 this

3.直接在按鈕上使用箭頭函數(shù)(推薦)

class App extends React.Component {
        constructor() {
          super()
          this.state = {
            message: 'hello world',
          }
        }
        btnClick() {
          this.setState({
            message: 'hello react',
          })
        }
        render() {
          return (
            <div>
              <h2>{this.state.message}</h2>
              {/* 直接綁定箭頭函數(shù) */}
              <button onClick={() => this.btnClick()}>修改文本</button>
            </div>
          )
        }
      }

再看一下此時(shí)執(zhí)行的流程:文章來源地址http://www.zghlxwxcb.cn/news/detail-776967.html

  1. onClick 綁定的是一個(gè)箭頭函數(shù),箭頭函數(shù)的 this 綁定的是App組件對象;
  2. 前面的兩個(gè)例子中是將這個(gè)函數(shù)引用賦值給 onClick,等待按鈕事件點(diǎn)擊,然后再觸發(fā)這個(gè)引用的函數(shù),onClick={this.btnClick};
  3. 而上面的代碼中,是 onClick={() => this.btnClick()},是將 () => this.btnClick() 這個(gè)箭頭函數(shù)賦值給 onClick,按鈕點(diǎn)擊觸發(fā)這個(gè)箭頭函數(shù),而箭頭函數(shù)內(nèi)部是一個(gè)已經(jīng)調(diào)用過的 btnClick() 函數(shù),包含 () ,調(diào)用時(shí)在箭頭函數(shù)內(nèi)部,所有 this 綁定的是 App 組件對象。

到了這里,關(guān)于react 事件函數(shù)中 this 綁定問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • react——事件綁定

    react——事件綁定

    ????????react有兩種寫法,一種是類組件,也叫有狀態(tài)組件;一種是函數(shù)式組件,也叫無狀態(tài)組件,而后引入了react hooks,函數(shù)式組件也能修改狀態(tài)。在這兩種組件中的事件綁定的原理一樣,寫法不一樣。這篇文章主要就是記錄這兩種組件中的事件綁定寫法。 ? ???????

    2023年04月26日
    瀏覽(12)
  • 前端react入門day02-React中的事件綁定與組件

    前端react入門day02-React中的事件綁定與組件

    (創(chuàng)作不易,感謝有你,你的支持,就是我前行的最大動(dòng)力,如果看完對你有幫助,請留下您的足跡) 目錄 React中的事件綁定 React 基礎(chǔ)事件綁定 使用事件對象參數(shù)? 傳遞自定義參數(shù)? 同時(shí)傳遞事件對象和自定義參數(shù)? React中的組件? 組件是什么 React組件 useState? 修改狀態(tài)的規(guī)

    2024年02月06日
    瀏覽(24)
  • JavaScript (五) -- JavaScript 事件(事件的綁定方式)

    目錄 1.??JavaScript 事件的概述: 2.? 事件的綁定(兩種方式): ????????JavaScript事件是 指當(dāng)網(wǎng)頁中某個(gè)元素被觸發(fā)時(shí),可以執(zhí)行一些JS代碼來處理這個(gè)事件 ,例如鼠標(biāo)單擊、鼠標(biāo)移動(dòng)、鍵盤按鍵等。事件通常被認(rèn)為是瀏覽器與用戶交互的方式之一。 ??????

    2024年02月03日
    瀏覽(22)
  • 【Jetpack】DataBinding 架構(gòu)組件 ② ( 字符串拼接函數(shù) | 綁定點(diǎn)擊事件函數(shù) | DataBinding 布局中使用 import 標(biāo)簽導(dǎo)入 Java、Kotlin 類 )

    【Jetpack】DataBinding 架構(gòu)組件 ② ( 字符串拼接函數(shù) | 綁定點(diǎn)擊事件函數(shù) | DataBinding 布局中使用 import 標(biāo)簽導(dǎo)入 Java、Kotlin 類 )

    在上一篇博客中 , 遇到 在 DataBinding 布局 中 , 向 TextView 組件設(shè)置 int 類型數(shù)據(jù)的情況會報(bào)錯(cuò) , 最終的處理方式是 將 int 類型的變量 student.age 通過 String.valueOf 函數(shù)轉(zhuǎn)為 字符串 類型 , 設(shè)置到 TextView 組件中 ; 此外 , 還可以 在 數(shù)據(jù)類 中定義 字符串拼接函數(shù) , 直接在 DataBinding 布局

    2023年04月08日
    瀏覽(27)
  • 使用擴(kuò)展函數(shù)方式,在Winform界面中快捷的綁定樹形列表TreeList控件和

    使用擴(kuò)展函數(shù)方式,在Winform界面中快捷的綁定樹形列表TreeList控件和

    在一些字典綁定中,往往為了方便展示詳細(xì)數(shù)據(jù),需要把一些結(jié)構(gòu)樹展現(xiàn)在樹列表TreeList控件中或者下拉列表的樹形控件TreeListLookUpEdit控件中,為了快速的處理數(shù)據(jù)的綁定操作,比較每次使用涉及太多細(xì)節(jié)的操作,我們可以把相關(guān)的數(shù)據(jù)綁定操作,放在一些輔助類的擴(kuò)展函數(shù)

    2024年02月11日
    瀏覽(32)
  • Unity按鈕事件的幾種綁定方式

    Unity按鈕事件的幾種綁定方式

    許久沒有寫C#代碼了,對于一些東西自己給整忘了,在此記錄下,方便以后自己查閱 獲取到按鈕組件,我是將代碼掛載在其父節(jié)點(diǎn)上。 在代碼中獲取此按鈕,并對他就進(jìn)行綁定。一般都是使用的這類情況。 在腳本中寫一個(gè)public函數(shù),作為按鈕的監(jiān)聽函數(shù),在按鈕的Inspector面

    2024年02月11日
    瀏覽(23)
  • 使用擴(kuò)展函數(shù)方式,在Winform界面中快捷的綁定樹形列表TreeList控件和TreeListLookUpEdit控件

    使用擴(kuò)展函數(shù)方式,在Winform界面中快捷的綁定樹形列表TreeList控件和TreeListLookUpEdit控件

    在一些字典綁定中,往往為了方便展示詳細(xì)數(shù)據(jù),需要把一些結(jié)構(gòu)樹展現(xiàn)在樹列表TreeList控件中或者下拉列表的樹形控件TreeListLookUpEdit控件中,為了快速的處理數(shù)據(jù)的綁定操作,比較每次使用涉及太多細(xì)節(jié)的操作,我們可以把相關(guān)的數(shù)據(jù)綁定操作,放在一些輔助類的擴(kuò)展函數(shù)

    2023年04月25日
    瀏覽(19)
  • Vue的數(shù)據(jù)綁定 事件 鍵盤 ,以及創(chuàng)建項(xiàng)目改端口號

    Vue的數(shù)據(jù)綁定 事件 鍵盤 ,以及創(chuàng)建項(xiàng)目改端口號

    一、Vue的數(shù)據(jù)綁定 1、單向數(shù)據(jù)綁定:將Model綁定到View上,當(dāng)通過JavaScript代碼改變了Model時(shí),View就會自動(dòng)刷新。不需要進(jìn)行額外的DOM 操作就可以實(shí)現(xiàn)視圖和模型的聯(lián)動(dòng) ? a、數(shù)據(jù)只保存一份 ? b、data—-DOM ? (1)插值表達(dá)式:{{ 表達(dá)式 }},將表達(dá)式的值在View中顯示出來 ?

    2024年02月12日
    瀏覽(21)
  • Unity 編輯器-創(chuàng)建模板腳本,并自動(dòng)綁定屬性,添加點(diǎn)擊事件

    Unity 編輯器-創(chuàng)建模板腳本,并自動(dòng)綁定屬性,添加點(diǎn)擊事件

    當(dāng)使用框架開發(fā)時(shí),Prefab掛載的很多腳本都有固定的格式。從Unity的基礎(chǔ)模板創(chuàng)建cs文件,再修改到應(yīng)有的模板,會浪費(fèi)一些時(shí)間。尤其是有大量的不同界面時(shí),每個(gè)都改一遍,浪費(fèi)時(shí)間不說,還有可能遺漏或錯(cuò)改。寫個(gè)腳本創(chuàng)建指定的模板代替C#基礎(chǔ)模板。 注:當(dāng)前腳本使用

    2024年02月13日
    瀏覽(86)
  • Qt UI上的按鈕和創(chuàng)建的按鈕綁定 click 點(diǎn)擊事件

    Qt UI上的按鈕和創(chuàng)建的按鈕綁定 click 點(diǎn)擊事件

    如果在ui 上 的按鈕 綁定點(diǎn)擊事件,按鈕鼠標(biāo)右鍵轉(zhuǎn)到槽,點(diǎn)擊clicked(),即可創(chuàng)建函數(shù)。 動(dòng)態(tài)創(chuàng)建的按鈕需要 用 connect 連接

    2024年02月15日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包