资讯专栏INFORMATION COLUMN

3、React组件中的this

Cheng_Gang / 1068人阅读

摘要:组件的是什么通过编写一个简单组件,并渲染出来,分别打印出自定义函数和中的被调用,指向测试函数单击打印函数中的指向单击结果如图可以看到,函数中的指向了组件实例,而函数中的则为,这是为何函数中的我们都知道函数中的不是在函数声明的时候定义的,而是

React组件的this是什么

通过编写一个简单组件,并渲染出来,分别打印出自定义函数和render中的this:

import React from "react";

const STR = "被调用,this指向:";

class App extends React.Component{
    constructor(){
        super()
    }

    //测试函数
    handler() {
        console.log(`handler ${STR}`,this);
    }

    render(){

        console.log(`render ${STR}`,this);
        return(
            

hello World

) } } export default App

结果如图:

可以看到,render函数中的this指向了组件实例,而handler()函数中的this则为undefined,这是为何?

JavaScript函数中的this

我们都知道JavaScript函数中的this不是在函数声明的时候定义的,而是在函数调用(即运行)的时候定义的

var student = {
    func: function() {
        console.log(this);
    };
};

student.func();
var studentFunc = student.func;
studentFunc();

这段代码运行,可以看到student.func()打印了student对象,因为此时this指向student对象;而studentFunc()打印了window,因为此时由window调用的,this指向window。

这段代码形象的验证了,JavaScript函数中的this不是在函数声明的时候,而是在函数运行的时候定义的;

同样,React组件也遵循JavaScript的这种特性,所以组件方法的‘调用者’不同会导致this的不同(这里的 “调用者” 指的是函数执行时的当前对象

“调用者”不同导致this不同

测试:分别在组件自带的生命周期函数以及自定义函数中打印this,并在render()方法中分别使用this.handler(),window.handler(),onCilck={this.handler}这三种方法调用handler():

/App.jsx
import React from "react";


const STR = "被调用,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);
    }


    //测试函数
    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 -> 组件实例App对象;

render中this.handler() -> 组件实例App对象 ;

render中window.handler() -> window对象;

onClick ={this.handler} -> undefined

继续使用事件触发组件的装载、更新和卸载过程:

/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);
}

使用三个按钮触发组件的装载、更新和卸载过程:

/index.html



    react-this


    
    
    
    

运行程序,依次单击“挂载”,绑定onClick={this.handler}“单击”按钮,“更新”和“卸载”按钮结果如下:

1. render()以及componentDIdMount()、componentDIdUpdate()等其他生命周期函数中的this都是组件实例;
2. this.handler()的调用者,为render()中的this,所以打印组件实例;
3. window.handler()的“调用者”,为window,所以打印window;
4. onClick={this.handler}的“调用者”为事件绑定,来源多样,这里打印undefined。
- 面对如此混乱的场景,如果我们想在onClick中调用自定义的组件方法,并在该方法中获取组将实例,我们就得进行转换上下文即绑定上下文:
自动绑定和手动绑定

React.createClass有一个内置的魔法,可以自动绑定所用的方法,使得其this指向组件的实例化对象,但是其他JavaScript类并没有这种特性;

所以React团队决定不再React组件类中实现自动绑定,把上下文转换的自由权交给开发者;

所以我们通常在构造函数中绑定方法的this指向:

import React from "react";


const STR = "被调用,this指向:";

class App extends React.Component{
    constructor(){
        super();

        this.handler = this.handler.bind(this);
    }
//测试函数
    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()绑定为组件实例后,this.handler()中的this就指向组将实例,即onClick={this.handler}打印出来的为组件实例;

总结:

React组件生命周期函数中的this指向组件实例;

自定义组件方法的this会因调用者不同而不同;

为了在组件的自定义方法中获取组件实例,需要手动绑定this到组将实例。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/92993.html

相关文章

  • React入门看这篇就够了

    摘要:背景介绍入门实例教程起源于的内部项目,因为该公司对市场上所有框架,都不满意,就决定自己写一套,用来架设的网站。做出来以后,发现这套东西很好用,就在年月开源了。也就是说,通过钩子函 react - JSX React 背景介绍 React 入门实例教程 React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套...

    luckyw 评论0 收藏0
  • React入门系列 - 3 state与props

    摘要:而主要被设计用于维持组件内部私有状态。初始化初始化需要在中进行。对于的定义为请求修改某个数据,而的实现则是将对变量的修改放入一个修改队列中,在一个循环之后进行批量更新结果深入点涉及的更新机制。推出了与版本之后推出来的就是为了解决这些问题的。 3.1 什么是state 我们要认识到,React中的组件其实是一个函数,所以state是函数内部的私有变量,外部其他组件或者方法都是无法直接访问...

    henry14 评论0 收藏0
  • React 深入系列3:Props 和 State

    摘要:深入系列,深入讲解了中的重点概念特性和模式等,旨在帮助大家加深对的理解,以及在项目中更加灵活地使用。下篇预告深入系列组件的生命周期我的新书进阶之路已上市,请大家多多支持链接京东当当 React 深入系列,深入讲解了React中的重点概念、特性和模式等,旨在帮助大家加深对React的理解,以及在项目中更加灵活地使用React。 React 的核心思想是组件化的思想,而React 组件的定...

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

    摘要:即组件内部可以引用其他组件,如注意在中,组件必须返回单一的根元素,这也是为什么组件中需要用标签包裹的原因。那么,这种情况下,为我们提供了生命周期的钩子函数,方便我们进行使用。showImg(https://user-gold-cdn.xitu.io/2019/5/8/16a94b981baecfa7);一个人并不是生来要给打败的,你尽可以把他消灭掉,可就是打不败他。      showImg...

    daryl 评论0 收藏0
  • 深入React知识点整理(二)

    摘要:承接上文,深入知识点整理一使用也满一年了,从刚刚会使用到逐渐探究其底层实现,以便学习几招奇技淫巧从而在自己的代码中使用,写出高效的代码。有限状态机,表示有限个状态以及在这些状态之间的转移和动作等行为的模型。 承接上文,深入React知识点整理(一)使用React也满一年了,从刚刚会使用到逐渐探究其底层实现,以便学习几招奇技淫巧从而在自己的代码中使用,写出高效的代码。下面整理一些知识点,...

    villainhr 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<