React組件中的this是什么

React組件中的this到底是指什么尘吗?看完這篇,再也不會(huì)有疑問浇坐。
-初步感受不同代碼位置睬捶,this打印什么。
-改變自定義方法的"調(diào)用者"近刘,看看this打印什么擒贸。
-該如何手動(dòng)綁定this臀晃。

編寫下面這個(gè)組件,將其渲染出來介劫。

import React from 'react';
const suffix = '被調(diào)用徽惋,this指向:';
export default class ReactThis extends React.Component {
  handler() {
    console.log(`handler${suffix}`, this)
  }
  render() {
    console.log(`render${suffix}`, this)
    return (
      <div>
        <h2 onClick={this.handler}>Hello React</h2>
      </div>
    );
  }

}

結(jié)果是,render()函數(shù)中的this指向了組件實(shí)例座韵,而handler()函數(shù)中的this則是一個(gè)undefined险绘。


image.png

image.png

自定義方法的"調(diào)用者"不同導(dǎo)致this不同誉碴。("調(diào)用者"是指函數(shù)執(zhí)行時(shí)的當(dāng)前對(duì)象)

分別在組件自帶的生命周期函數(shù)以及自定義的handler()方法中打印this宦棺,并在render()方法里分別使用this.handler()、window.handler()黔帕、onClick={this.handler}這三種方法調(diào)用handler()代咸,看看this的指向。

import React from 'react';
const suffix = '被調(diào)用成黄,this指向:';
export default class ReactThis extends React.Component {
  componentWillMount(){
    console.log(`componentWillMount${suffix}`, this)
  }
  componentDidMount(){
    console.log(`componentDidMount${suffix}`, this)
  }
  componentWillReceiveProps(){
    console.log(`componentWillReceiveProps${suffix}`, this)
  }
  shouldComponentUpdate(){
    console.log(`shouldComponentUpdate${suffix}`, this)
  }
  componentWillUpdate(){
    console.log(`componentWillUpdate${suffix}`, this)
  }
  componentDidUpdate(){
    console.log(`componentDidUpdate${suffix}`, this)
  }
  componentWillUnmount(){
    console.log(`componentWillUnmount${suffix}`, this)
  }
  
  handler() {
    console.log(`handler${suffix}`, this)
  }
  render() {
    console.log(`render${suffix}`, this)
    this.handler()
    window.handler = this.handler;
    window.handler();
    return (
      <div>
        <h2 onClick={this.handler}>Hello React</h2>
      </div>
    );
  }

}

運(yùn)行程序后發(fā)現(xiàn)呐芥,
render()以及componentWillMount()、componentDidMount()等其他生命周期函數(shù)中的this慨默,都是指向組件實(shí)例贩耐。
window.handler()中的this指向了window。
onClick={this.handler}中的this打印了undefined厦取。


image.png

沒有自動(dòng)綁定

如果this沒有指向組件實(shí)例潮太,是無法使用state等組件實(shí)例對(duì)象的屬性的。
但是React組件中沒有實(shí)現(xiàn)this的自動(dòng)綁定虾攻,函數(shù)的"調(diào)用者不同"導(dǎo)致this的指向不同铡买。具體this是指什么,React把這種上下文轉(zhuǎn)換的自由權(quán)交給了開發(fā)者霎箍。

手動(dòng)綁定this

1奇钞、在構(gòu)造函數(shù)里綁定

constructor(){
    super()
    this.state = {}
    this.handler = this.handler.bind(this)
  }

綁定之后,觸發(fā)點(diǎn)擊事件漂坏,this已經(jīng)指向組件實(shí)例了景埃。


image.png

在構(gòu)造函數(shù)里綁定this的好處是,僅需綁定一次顶别,避免每次渲染時(shí)都要重新綁定谷徙,函數(shù)在別處復(fù)用時(shí)也不需要再次綁定了。
2驯绎、在屬性中臨時(shí)綁定

render() {
    console.log(`render${suffix}`, this)
    this.handler()
    window.handler = this.handler;
    window.handler();
    return (
      <div>
        <h2 onClick={this.handler.bind(this)}>Hello React</h2>
        <div>value:{this.state.value}</div>
      </div>
    );
  }

3完慧、使用箭頭函數(shù)

render() {
    console.log(`render${suffix}`, this)
    this.handler()
    window.handler = this.handler;
    window.handler();
    return (
      <div>
        <h2 onClick={()=>{this.handler()}}>Hello React</h2>
        <div>value:{this.state.value}</div>
      </div>
    );
  }

箭頭函數(shù)會(huì)捕獲其所在上下文的this值,作為自己的this值剩失。
4屈尼、es7寫法

handler=()=> {
    console.log(`handler${suffix}`, this)
  }
  render() {
    console.log(`render${suffix}`, this)
    this.handler()
    window.handler = this.handler;
    window.handler();
    return (
      <div>
        <h2 onClick={this.handler}>Hello React</h2>
        <div>value:{this.state.value}</div>
      </div>
    );
  }

然而es6并不支持es7寫法册着,不過沒關(guān)系,安裝一個(gè)babel-preset-stage-0
配置一下.babelrc脾歧,就可以支持了甲捏。

"presets": [
    "es2015",
    "stage-0",
    "react"
  ],

這么多手動(dòng)綁定this的方法,推薦 1涨椒,3摊鸡,4。

外傳:

var person = {
  speak: function() {
    console.log(this)
  }
}
person.speak();
var _speak = person.speak;
_speak()

person.speak() this指向什么蚕冬?
_speak()this指向什么?

又一個(gè)外傳:

var person = {
  speak: ()=> {
    console.log(this)
  }
}
person.speak();
var _speak = person.speak;
_speak()

person.speak() this指向什么是辕?
_speak()this指向什么囤热?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市获三,隨后出現(xiàn)的幾起案子旁蔼,更是在濱河造成了極大的恐慌,老刑警劉巖疙教,帶你破解...
    沈念sama閱讀 212,080評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棺聊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡贞谓,警方通過查閱死者的電腦和手機(jī)限佩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裸弦,“玉大人祟同,你說我怎么就攤上這事±砀恚” “怎么了晕城?”我有些...
    開封第一講書人閱讀 157,630評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)窖贤。 經(jīng)常有香客問我砖顷,道長(zhǎng),這世上最難降的妖魔是什么赃梧? 我笑而不...
    開封第一講書人閱讀 56,554評(píng)論 1 284
  • 正文 為了忘掉前任滤蝠,我火速辦了婚禮,結(jié)果婚禮上槽奕,老公的妹妹穿的比我還像新娘几睛。我一直安慰自己,他們只是感情好粤攒,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評(píng)論 6 386
  • 文/花漫 我一把揭開白布所森。 她就那樣靜靜地躺著囱持,像睡著了一般。 火紅的嫁衣襯著肌膚如雪焕济。 梳的紋絲不亂的頭發(fā)上纷妆,一...
    開封第一講書人閱讀 49,856評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音晴弃,去河邊找鬼掩幢。 笑死,一個(gè)胖子當(dāng)著我的面吹牛上鞠,可吹牛的內(nèi)容都是我干的际邻。 我是一名探鬼主播,決...
    沈念sama閱讀 39,014評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼芍阎,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼世曾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谴咸,我...
    開封第一講書人閱讀 37,752評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤轮听,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后岭佳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體血巍,經(jīng)...
    沈念sama閱讀 44,212評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評(píng)論 2 327
  • 正文 我和宋清朗相戀三年珊随,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了述寡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,687評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡玫恳,死狀恐怖辨赐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情京办,我是刑警寧澤掀序,帶...
    沈念sama閱讀 34,347評(píng)論 4 331
  • 正文 年R本政府宣布,位于F島的核電站惭婿,受9級(jí)特大地震影響不恭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜财饥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評(píng)論 3 315
  • 文/蒙蒙 一换吧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钥星,春花似錦沾瓦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽风喇。三九已至,卻和暖如春缕探,著一層夾襖步出監(jiān)牢的瞬間魂莫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評(píng)論 1 266
  • 我被黑心中介騙來泰國打工爹耗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留耙考,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,406評(píng)論 2 360
  • 正文 我出身青樓潭兽,卻偏偏與公主長(zhǎng)得像倦始,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子讼溺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評(píng)論 2 349