摘要:組件的是什么通過編寫一個簡單組件,并渲染出來,分別打印出自定義函數(shù)和中的被調(diào)用,指向測試函數(shù)單擊打印函數(shù)中的指向單擊結(jié)果如圖可以看到,函數(shù)中的指向了組件實(shí)例,而函數(shù)中的則為,這是為何函數(shù)中的我們都知道函數(shù)中的不是在函數(shù)聲明的時候定義的,而是
React組件的this是什么
通過編寫一個簡單組件,并渲染出來,分別打印出自定義函數(shù)和render中的this:
import React from "react"; const STR = "被調(diào)用,this指向:"; class App extends React.Component{ constructor(){ super() } //測試函數(shù) handler() { console.log(`handler ${STR}`,this); } render(){ console.log(`render ${STR}`,this); return() } } export default Apphello World
結(jié)果如圖:
可以看到,render函數(shù)中的this指向了組件實(shí)例,而handler()函數(shù)中的this則為undefined,這是為何?
JavaScript函數(shù)中的this我們都知道JavaScript函數(shù)中的this不是在函數(shù)聲明的時候定義的,而是在函數(shù)調(diào)用(即運(yùn)行)的時候定義的
var student = { func: function() { console.log(this); }; }; student.func(); var studentFunc = student.func; studentFunc();
這段代碼運(yùn)行,可以看到student.func()打印了student對象,因?yàn)榇藭rthis指向student對象;而studentFunc()打印了window,因?yàn)榇藭r由window調(diào)用的,this指向window。
這段代碼形象的驗(yàn)證了,JavaScript函數(shù)中的this不是在函數(shù)聲明的時候,而是在函數(shù)運(yùn)行的時候定義的;
同樣,React組件也遵循JavaScript的這種特性,所以組件方法的‘調(diào)用者’不同會導(dǎo)致this的不同(這里的 “調(diào)用者” 指的是函數(shù)執(zhí)行時的當(dāng)前對象)
“調(diào)用者”不同導(dǎo)致this不同測試:分別在組件自帶的生命周期函數(shù)以及自定義函數(shù)中打印this,并在render()方法中分別使用this.handler(),window.handler(),onCilck={this.handler}這三種方法調(diào)用handler():
/App.jsx
import React from "react"; const STR = "被調(diào)用,this指向:"; class App extends React.Component{ constructor(){ super() } ComponentDidMount() { console.log(`ComponentDidMount ${STR}`,this); } componentWillReceiveProps() { console.log(`componentWillReceiveProps ${STR}`,this); } shouldComponentUpdate() { console.log(`shouldComponentUpdate ${STR}`,this); return true; } componentDidUpdate() { console.log(`componentDidUpdate ${STR}`,this); } componentWillUnmount() { console.log(`componentWillUnmount ${STR}`,this); } //測試函數(shù) handler() { console.log(`handler ${STR}`,this); } render(){ console.log(`render ${STR}`,this); this.handler(); window.handler = this.handler; window.handler(); return() } } export default Apphello World
可以看到:
render中this -> 組件實(shí)例App對象;
render中this.handler() -> 組件實(shí)例App對象 ;
render中window.handler() -> window對象;
onClick ={this.handler} -> undefined
繼續(xù)使用事件觸發(fā)組件的裝載、更新和卸載過程:
/index.js
import React from "react" import {render,unmountComponentAtNode} from "react-dom" import App from "./App.jsx" const root=document.getElementById("root") console.log("首次掛載"); let instance = render(,root); window.renderComponent = () => { console.log("掛載"); instance = render( ,root); } window.setState = () => { console.log("更新"); instance.setState({foo: "bar"}); } window.unmountComponentAtNode = () => { console.log("卸載"); unmountComponentAtNode(root); }
使用三個按鈕觸發(fā)組件的裝載、更新和卸載過程:
/index.html
react-this
運(yùn)行程序,依次單擊“掛載”,綁定onClick={this.handler}“單擊”按鈕,“更新”和“卸載”按鈕結(jié)果如下:
1. render()以及componentDIdMount()、componentDIdUpdate()等其他生命周期函數(shù)中的this都是組件實(shí)例; 2. this.handler()的調(diào)用者,為render()中的this,所以打印組件實(shí)例; 3. window.handler()的“調(diào)用者”,為window,所以打印window; 4. onClick={this.handler}的“調(diào)用者”為事件綁定,來源多樣,這里打印undefined。 - 面對如此混亂的場景,如果我們想在onClick中調(diào)用自定義的組件方法,并在該方法中獲取組將實(shí)例,我們就得進(jìn)行轉(zhuǎn)換上下文即綁定上下文:自動綁定和手動綁定
React.createClass有一個內(nèi)置的魔法,可以自動綁定所用的方法,使得其this指向組件的實(shí)例化對象,但是其他JavaScript類并沒有這種特性;
所以React團(tuán)隊(duì)決定不再React組件類中實(shí)現(xiàn)自動綁定,把上下文轉(zhuǎn)換的自由權(quán)交給開發(fā)者;
所以我們通常在構(gòu)造函數(shù)中綁定方法的this指向:
import React from "react"; const STR = "被調(diào)用,this指向:"; class App extends React.Component{ constructor(){ super(); this.handler = this.handler.bind(this); } //測試函數(shù) handler() { console.log(`handler ${STR}`,this); } render(){ console.log(`render ${STR}`,this); this.handler(); window.handler = this.handler; window.handler(); return() } } export default Apphello World
將this.handler()綁定為組件實(shí)例后,this.handler()中的this就指向組將實(shí)例,即onClick={this.handler}打印出來的為組件實(shí)例;
總結(jié):React組件生命周期函數(shù)中的this指向組件實(shí)例;
自定義組件方法的this會因調(diào)用者不同而不同;
為了在組件的自定義方法中獲取組件實(shí)例,需要手動綁定this到組將實(shí)例。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/92993.html
摘要:背景介紹入門實(shí)例教程起源于的內(nèi)部項(xiàng)目,因?yàn)樵摴緦κ袌錾纤锌蚣?,都不滿意,就決定自己寫一套,用來架設(shè)的網(wǎng)站。做出來以后,發(fā)現(xiàn)這套東西很好用,就在年月開源了。也就是說,通過鉤子函 react - JSX React 背景介紹 React 入門實(shí)例教程 React 起源于 Facebook 的內(nèi)部項(xiàng)目,因?yàn)樵摴緦κ袌錾纤?JavaScript MVC 框架,都不滿意,就決定自己寫一套...
摘要:而主要被設(shè)計(jì)用于維持組件內(nèi)部私有狀態(tài)。初始化初始化需要在中進(jìn)行。對于的定義為請求修改某個數(shù)據(jù),而的實(shí)現(xiàn)則是將對變量的修改放入一個修改隊(duì)列中,在一個循環(huán)之后進(jìn)行批量更新結(jié)果深入點(diǎn)涉及的更新機(jī)制。推出了與版本之后推出來的就是為了解決這些問題的。 3.1 什么是state 我們要認(rèn)識到,React中的組件其實(shí)是一個函數(shù),所以state是函數(shù)內(nèi)部的私有變量,外部其他組件或者方法都是無法直接訪問...
摘要:深入系列,深入講解了中的重點(diǎn)概念特性和模式等,旨在幫助大家加深對的理解,以及在項(xiàng)目中更加靈活地使用。下篇預(yù)告深入系列組件的生命周期我的新書進(jìn)階之路已上市,請大家多多支持鏈接京東當(dāng)當(dāng) React 深入系列,深入講解了React中的重點(diǎn)概念、特性和模式等,旨在幫助大家加深對React的理解,以及在項(xiàng)目中更加靈活地使用React。 React 的核心思想是組件化的思想,而React 組件的定...
摘要:即組件內(nèi)部可以引用其他組件,如注意在中,組件必須返回單一的根元素,這也是為什么組件中需要用標(biāo)簽包裹的原因。那么,這種情況下,為我們提供了生命周期的鉤子函數(shù),方便我們進(jìn)行使用。showImg(https://user-gold-cdn.xitu.io/2019/5/8/16a94b981baecfa7);一個人并不是生來要給打敗的,你盡可以把他消滅掉,可就是打不敗他。? ? ? showImg...
摘要:承接上文,深入知識點(diǎn)整理一使用也滿一年了,從剛剛會使用到逐漸探究其底層實(shí)現(xiàn),以便學(xué)習(xí)幾招奇技淫巧從而在自己的代碼中使用,寫出高效的代碼。有限狀態(tài)機(jī),表示有限個狀態(tài)以及在這些狀態(tài)之間的轉(zhuǎn)移和動作等行為的模型。 承接上文,深入React知識點(diǎn)整理(一)使用React也滿一年了,從剛剛會使用到逐漸探究其底層實(shí)現(xiàn),以便學(xué)習(xí)幾招奇技淫巧從而在自己的代碼中使用,寫出高效的代碼。下面整理一些知識點(diǎn),...
閱讀 948·2021-11-22 12:09
閱讀 3715·2021-09-27 13:36
閱讀 1403·2021-08-20 09:37
閱讀 4027·2019-12-27 12:22
閱讀 2365·2019-08-30 15:55
閱讀 2370·2019-08-30 13:16
閱讀 2831·2019-08-26 17:06
閱讀 3442·2019-08-23 18:32