React事件處理函數(shù)this指向解析

我們知道个绍,由于瀏覽器的工作原理翩蘸,事件處理函數(shù)當(dāng)中的this都是指向當(dāng)前的綁定了事件處理函數(shù)的DOM節(jié)點(diǎn)對(duì)象币喧。但是一般在開(kāi)發(fā)過(guò)程中我們都需要其內(nèi)部的this指向的應(yīng)該是這個(gè)組件的實(shí)例本身。常用的有以下三種方法:

方法一

export default class Test extends React.Component {
  constructor () {
    super()
    this.value = 1
    this.handleClick = this.handleClick.bind(this)
  }

  handleClick () {
    console.log(this.value)
  }

  render () {
    return <div>
      <button onClick={this.handleClick}>點(diǎn)我</button>
    </div>
  }
}

這種方法是由我們?cè)跇?gòu)造函數(shù)中手動(dòng)為事件處理函數(shù)硬綁定this伤为。

方法二

export default class Test extends React.Component {
  constructor () {
    super()
    this.value = 1
  }

  handleClick () {
    console.log(this.value)
  }

  render () {
    return <div>
      <button onClick={this.handleClick.bind(this)}>點(diǎn)我</button>
    </div>
  }
}

這種方法其實(shí)和第一種應(yīng)該是一樣的咒循,只不過(guò)綁定的位置發(fā)生了變化而已。

方法三

export default class Test extends React.Component {
  constructor () {
    super()
    this.value = 1
  }

  handleClick (e) {
    console.log(e)
    console.log(this.value)
  }

  render () {
    return <div>
      <button onClick={(e) => {
        this.handleClick(e)
      }}>點(diǎn)我
      </button>
    </div>
  }
}

第三種方法運(yùn)用的是箭頭函數(shù)內(nèi)部this不可變性 (不可變性不是指箭頭函數(shù)內(nèi)部的 this永遠(yuǎn)指向一致绞愚,而是指其內(nèi)部的 this永遠(yuǎn)指向箭頭函數(shù)被定義時(shí)外部最近的 this叙甸。

在這種情況下,由于事件處理函數(shù)是一個(gè)箭頭函數(shù)位衩,那沒(méi)箭頭函數(shù)內(nèi)部的this指向就不可以被改變了裆蒸,this指向離箭頭函數(shù)最近的外部this,而render()方法中的this由于react的自動(dòng)綁定機(jī)制糖驴,this指向?qū)嵗旧砹诺唬约^函數(shù)的this也指向?qū)嵗旧怼6?code>this.handleClick()這種調(diào)用方式其實(shí)和handleClick.apply(this)是等效的贮缕,所以這種寫法也可以久妆。

ES7的寫法

export default class Test extends React.Component {
  constructor () {
    super()
    this.value = 1
  }

  handleClick = (e) => {
    console.log(e)
    console.log(this.value)
  }

  render () {
    return <div>
      <button onClick={this.handleClick}>點(diǎn)我</button>
    </div>
  }
}

不過(guò),在Class中直接賦值是ES7的寫法(其實(shí)和下面的寫法等價(jià))跷睦,ES6并不支持筷弦,只用ES6的話可以用下面寫法

export default class Test extends React.Component {
  constructor () {
    super()
    this.value = 1
    this.handleClick = (e) => {
      console.log(e)
      console.log(this.value)
    }
  }

  render () {
    return <div>
      <button onClick={this.handleClick}>點(diǎn)我</button>
    </div>
  }
}

總結(jié)

介紹了五種寫法,總的來(lái)說(shuō)可以分為兩類抑诸,前三種是一類烂琴,后兩種算一類。這兩類最大的區(qū)別就是前者的事件處理函數(shù)是定義在類的原型之上蜕乡,實(shí)現(xiàn)了代碼的復(fù)用奸绷。而后者的事件處理函數(shù)是作為實(shí)例屬性,每個(gè)類的實(shí)例在實(shí)例化時(shí)都需要定義一遍事件處理函數(shù)层玲。

參考鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末号醉,一起剝皮案震驚了整個(gè)濱河市反症,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌畔派,老刑警劉巖铅碍,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異线椰,居然都是意外死亡胞谈,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門憨愉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)烦绳,“玉大人,你說(shuō)我怎么就攤上這事配紫【睹埽” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵躺孝,是天一觀的道長(zhǎng)睹晒。 經(jīng)常有香客問(wèn)我,道長(zhǎng)括细,這世上最難降的妖魔是什么伪很? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮奋单,結(jié)果婚禮上锉试,老公的妹妹穿的比我還像新娘。我一直安慰自己览濒,他們只是感情好呆盖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著贷笛,像睡著了一般应又。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乏苦,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天株扛,我揣著相機(jī)與錄音,去河邊找鬼汇荐。 笑死洞就,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的掀淘。 我是一名探鬼主播旬蟋,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼革娄!你這毒婦竟也來(lái)了倾贰?” 一聲冷哼從身側(cè)響起冕碟,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎匆浙,沒(méi)想到半個(gè)月后安寺,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吞彤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年我衬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叹放。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饰恕。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖井仰,靈堂內(nèi)的尸體忽然破棺而出埋嵌,到底是詐尸還是另有隱情,我是刑警寧澤俱恶,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布雹嗦,位于F島的核電站,受9級(jí)特大地震影響合是,放射性物質(zhì)發(fā)生泄漏了罪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一聪全、第九天 我趴在偏房一處隱蔽的房頂上張望泊藕。 院中可真熱鬧,春花似錦难礼、人聲如沸娃圆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)讼呢。三九已至,卻和暖如春谦炬,著一層夾襖步出監(jiān)牢的瞬間悦屏,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工键思, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窜管,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓稚机,卻偏偏與公主長(zhǎng)得像幕帆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赖条,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 函數(shù)參數(shù)的默認(rèn)值 基本用法 在ES6之前失乾,不能直接為函數(shù)的參數(shù)指定默認(rèn)值常熙,只能采用變通的方法。 上面代碼檢查函數(shù)l...
    呼呼哥閱讀 3,384評(píng)論 0 1
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理碱茁,服務(wù)發(fā)現(xiàn)裸卫,斷路器,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 睡了很久很久 、夢(mèng)中的自己沒(méi)有勇氣蜓氨,好象一個(gè)陽(yáng)光匱乏的冬日聋袋,一切都因冰冷而蜷縮,于是愛(ài)情也隨之模糊穴吹,不在清晰幽勒。確...
    紅得不像話閱讀 267評(píng)論 0 4
  • 當(dāng)我們想要變得更自由、更喜悅和富足的時(shí)候港令,我們其實(shí)是有兩條路啥容,路不在遠(yuǎn)方,而在腳下: 一條路是下旋的地獄之路顷霹,我們...
    齊文系統(tǒng)排列閱讀 392評(píng)論 0 0
  • 今天在和小伙伴在看一功能時(shí)淋淀,發(fā)現(xiàn)某個(gè)效果圖很類似 淘寶的一個(gè)滑動(dòng)遥昧,于是好奇的看了下淘寶和天貓的,先上效果圖: 之前...
    天空中的球閱讀 1,994評(píng)論 3 16