成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

3、React組件中的this

Cheng_Gang / 1234人閱讀

摘要:組件的是什么通過編寫一個簡單組件,并渲染出來,分別打印出自定義函數(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(
            

hello World

) } } export default App

結(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(

            

hello World

) } } export default App

可以看到:

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(

            

hello World

) } } export default App

將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

相關(guān)文章

  • React入門看這篇就夠了

    摘要:背景介紹入門實(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 框架,都不滿意,就決定自己寫一套...

    luckyw 評論0 收藏0
  • React入門系列 - 3 state與props

    摘要:而主要被設(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)部的私有變量,外部其他組件或者方法都是無法直接訪問...

    henry14 評論0 收藏0
  • React 深入系列3:Props 和 State

    摘要:深入系列,深入講解了中的重點(diǎn)概念特性和模式等,旨在幫助大家加深對的理解,以及在項(xiàng)目中更加靈活地使用。下篇預(yù)告深入系列組件的生命周期我的新書進(jìn)階之路已上市,請大家多多支持鏈接京東當(dāng)當(dāng) React 深入系列,深入講解了React中的重點(diǎn)概念、特性和模式等,旨在幫助大家加深對React的理解,以及在項(xiàng)目中更加靈活地使用React。 React 的核心思想是組件化的思想,而React 組件的定...

    hiyayiji 評論0 收藏0
  • React精髓!一篇全概括(急速)

    摘要:即組件內(nèi)部可以引用其他組件,如注意在中,組件必須返回單一的根元素,這也是為什么組件中需要用標(biāo)簽包裹的原因。那么,這種情況下,為我們提供了生命周期的鉤子函數(shù),方便我們進(jìn)行使用。showImg(https://user-gold-cdn.xitu.io/2019/5/8/16a94b981baecfa7);一個人并不是生來要給打敗的,你盡可以把他消滅掉,可就是打不敗他。? ? ? showImg...

    daryl 評論0 收藏0
  • 深入React知識點(diǎn)整理(二)

    摘要:承接上文,深入知識點(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),...

    villainhr 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<