返回顶部
首页 > 资讯 > 前端开发 > JavaScript >详解React中的this指向
  • 257
分享到

详解React中的this指向

2024-04-02 19:04:59 257人浏览 八月长安
摘要

目录起因:经过:1.构造函数2.render 函数3.bind 和箭头函数结果:方法一:在构造函数中使用bind方法二:将箭头函数赋值给类的属性注意:性能存在差异打算记流水账一般细数

打算记流水账一般细数一下 React 中的 this 指向问题,具体流程按事件三要素:起因,经过,结果。哈哈哈哈哈!

起因:

众所周知,React 的设计是响应式的,使用者无需操纵 DOM,操纵数据,页面就会渲染更新。

数据一变就更新,是更新所有的 DOM 吗?当然不是,哪些变了就重新渲染哪些。那就要对数据变化前后的 DOM 进行比较。直接对比真实 DOM 吗?这样性能会很低,React 比较的是虚拟 DOM,虚拟 DOM 也是对象,只不过相较真实 DOM而言,少了很多属性,更“轻”。

如何写虚拟 DOM 呢?原生js我们可以使用 document.createElement() 方法,创建节点。React 中也可以通过 React.createElement(component, props, children),但是呢这种写法遇见多层嵌套,就能让人眼花缭乱。于是 JSX “横空出世”,JSX 其实就是,React.createElement 的语法糖,但是我们用起来更加方便,可以直接写成 <p id="test">hello</p> 这种形式。

但是呢问题又又来了!JSX 语法是不被 webpack 识别的,WEBpack 默认只能处理 .js 后缀名的文件,所以需要借助 Babel 这个 javascript 编译器,而 babel 开启了严格模式 **


import React, { Component } from 'react'

export default class index extends Component {
    // speak(){
    //     console.log(this)//输出undefined
    // }
    speak = () => console.log(this)//输出该组件
    render() {
        return (
            <div>
                <button onClick={this.speak}>按钮</button>
            </div>
        )
    }
}

this 本质上就是指向它的调用者,this 是在函数运行时才绑定,JS 里边普通函数都是 window 调用的,所以指向 window,开启了严格模式之后是 undefined。


(function(){
    console.log(this)//window
})()

在 JSX 中传递的事件不是一个字符串(在原生 JS 的中监听事件,采用的是回调函数的形式,在Vue中给监听事件传递的是字符串变量),而是一个函数(如上面的:onClick={this.speak}),此时onClick即是中间变量,最终是由React调用该函数,而因为开启了严格模式的缘故,this 是undefined,所以处理函数中的this指向会丢失。

经过:

事实上我们需要的是 this 指向当前实例化对象,无疑会使代码编写方便很多。类式组件里边有两地方的this恰好指向当前实例化对象。

1.构造函数

类式组件里面的构造器里面的this是指向实例对象的,这是 es6 类的特性,

众所周知 Javascript 里面是没有像 c++,JAVA 里面的的类的概念,ES6 类的实现也是基于原型链来实现的,

在 ES6 以前实例化一个对象应该这样:


function Animal(name, age) {
  this.name = name
  this.age = age
}
Animal.prototype.say = function () {
  console.log(this.name)
}
const Dog = new Animal('dog', 3)
Dog.say()  //会在控制台打印出dog

其中的 new 运算符,先产生了一个空对象 {},然后生成一个 this 指针,将 this 指针指向这个空对象;运行构造函数时,就相当于{}.name=dog,{}.age=3一样的为这个对象动态添加属性。最后将这个生成好的对象付给 Dog,

当我们使用 ES6 的 class 来声明上面这个类的话,代码如下:


class Animal {
  constructor(name, age) {
    this.name = name
    this.age = age
  }
  say() {
    console.log(this.name)
  }
}
const Dog = new Animal('dog', 3)
Dog.say()  //会在控制台打印出dog

类实现和上面应该大差不差,所以this是指向实例对象的。

2.render 函数

render 函数里面的 this,也是指向实例的。为啥呢?

首先 render 方法是在类式组件的原型上边的,React发现组件是使用类定义的时候,后边就会 new 出来该类的实例,注意这个实例是 React 帮你 new 出来的,随后实例调用 render 方法,将虚拟 DOM 转换为真实 DOM,所以 render 中的this 就是指向实例咯,毕竟是他调用的嘛!,类似的呢,render 是一个生命周期钩子,那其他的生命周期钩子里面的 this也是指向实例组件的。

3.bind 和箭头函数

解决 this 问题呢,要有两个知识储

(1)bind
call apply bind 都是定义在函数原型上边的,用来改变函数 this 指向,传入的第一个参数是 this,后面的参数就是fun1的参数

区别:

  • call 和 bind 传给调用的函数是可以传多个 apply 则是将参数放进一个数组
  • call 和 apply 返回立即执行函数,bind 返回新的函数,bind()() 也是立即执行
  • 使用 bind 绑定 this 后,该函数里面的 this 不能变化了,不论是谁调用

let aa = {
    fun1: function(a,b){
        console.log(this)
        console.log(a-b);
    }
}        
let bb = {
    fun2: function(a,b){
        console.log(this)
        console.log(a+b);
    }
}

aa.fun1.call(bb,11,22);//bb-11
bb.fun2.apply(aa,[11,22]);//aa 33
aa.fun1.bind(bb,11,22)();//bb -11

(2)箭头函数
箭头函数:箭头函数并不会创建自己的执行上下文,所以箭头函数中的this都是外层的this,会向外作用域中,一层层查找this,直到有 this 的定义


const A = {
    arrow:() =>{
        console.log(this)//window
    },
    func:function(){
        this.arrow()//window
        console.log(this)//A
        setTimeout(() => {
            console.log(this)//A
        });
    }
}
A.arrow()
A.func()

结果:

解决方法俺会两,嘿嘿!

方法一:在构造函数中使用bind


import React, { Component } from 'react'

export default class index extends Component {
    constructor(){
        super()
        this.speak = this.speak.bind(this)
        
    }
    speak(){
        console.log(this)//输出当前实例对象
    }
    render() {
        return (
            <div>
                <button onClick={this.speak}>按钮</button>
            </div>
        )
    }
}

方法二:将箭头函数赋值给类的属性


import React, { Component } from 'react'

export default class index extends Component {
    speak = () =>{
        console.log(this)
    }
    render() {
        return (
            <div>
                <button onClick={this.speak}>按钮</button>
            </div>
        )
    }
}//需要传参的话,可以使用函数柯里化的思想

注意:性能存在差异

使用箭头函数来解决性能会比较低,因为箭头函数不是方法,它们是匿名函数表达式,所以将它们添加到类中的唯一方法是赋值给属性。前面介绍ES6的类的时候可以看出来,ES 类以完全不同的方式处理方法和属性

方法被添加到类的原型中,而不是每个实例定义一次。

类属性语法是为相同的属性分配给每一个实例的语法糖,实际上会在 constructor里面这样实现:


    constructor(){
        super()
        this.speak = () => {console.log(this)}
    }

这意味着新实例被创建时,函数就会被重新定义,丢失了JS实例共享原型方法的优势。而方法一,只是在生成实例时多了一步 bind 操作,在效率与内存占用上都有极大的优势

以上就是详解React中的this指向的详细内容,更多关于React中的this指向的资料请关注编程网其它相关文章!

--结束END--

本文标题: 详解React中的this指向

本文链接: https://lsjlt.com/news/124571.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 详解React中的this指向
    目录起因:经过:1.构造函数2.render 函数3.bind 和箭头函数结果:方法一:在构造函数中使用bind方法二:将箭头函数赋值给类的属性注意:性能存在差异打算记流水账一般细数...
    99+
    2024-04-02
  • JQuery中this的指向详解
    JavaScript中的this不总是指向当前对象,函数或类中的this指向与调用这个函数的对象以及上下文环境是息息相关的。 如在全局作用域调用一个含this的对象,此时当前对象的t...
    99+
    2024-04-02
  • JavaScript中的this指向问题详解
    前言 相信我,只要记住本文的 7️⃣ 步口诀,就能彻底掌握 JS 中的 this 指向。 先念口诀:箭头函数、new、bind、apply 和 call、欧...
    99+
    2024-04-02
  • 一文详解JavaScript中this指向的问题
    目录1. 默认绑定2. 隐式绑定3. 显示绑定4. new 绑定5. 箭头函数的this6. 优先级7. 总结前提:文章讨论的都是非严格模式下this指向 1. 默认绑定 例子1 ...
    99+
    2023-05-14
    JavaScript this指向 JavaScript this
  • JavaScript函数中this指向问题详解
    this关键字 哪个对象调用函数,函数里面的this指向哪个对象。 **严格模式下:**在全局环境中,this指向的是undefined **非严格模式下:**在全局环境中,thi...
    99+
    2024-04-02
  • JavaScript 中this指向问题案例详解
    总结 全局环境 ➡️ window 普通函数 ➡️ window 或 undefined 构造函数 ...
    99+
    2024-04-02
  • JavaScript this的原理以及指向详解
    怎么判断this指向? ①在全局环境中调用就指向window。 ②作为对象的方法调用就指向该对象。 ③作为构造函数调用就指向这个新创建的对象。 ④可...
    99+
    2024-04-02
  • JS 箭头函数的this指向详解
    箭头函数是ES6中的新增特性,他没有自己的this,其this指向从外层代码库继承。 使用箭头函数时要注意一下几点: 箭头函数不能用作构造函数,用的话会抛出一个错误 ...
    99+
    2024-04-02
  • JavaScript函数this指向问题详解
    目录一、 函数内 this 的指向1、普通函数2、构造函数3、对象方法4、事件绑定方法5、定时器函数6、立即执行函数二、改变函数内部 this 指向1、call 方法2、apply ...
    99+
    2024-04-02
  • Javascript中函数分类&this指向的实例详解
    JS中定义函数的三种方式 通过实例来说明吧 <script> //method1 function fn() { ...
    99+
    2024-04-02
  • JavaScript中的this指向和自定义属性详解
    目录1.this关键字2.自定义属性3.综合案例1:tab选项卡的实现附录总结1.this关键字 this指向的是当前元素 全局函数中的this指向window对象 代码中声明...
    99+
    2024-04-02
  • Vue中关于this指向的问题示例详解
    目录由Vue管理的函数不被vue管理的函数this指向大致分类总结在Vue中,方法体里用this调用vue实例的数据,有时会指向window,导致调用失败报错。 由Vue管理的函数 ...
    99+
    2024-04-02
  • JavaScript中this指针指向怎么理解
    这篇“JavaScript中this指针指向怎么理解”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JavaScript中th...
    99+
    2023-07-04
  • JS中的this指向问题详细介绍
    这篇文章主要介绍“JS中的this指向问题详细介绍”,在日常操作中,相信很多人在JS中的this指向问题详细介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JS中的this...
    99+
    2024-04-02
  • React中事件绑定this指向三种方法的实现
    1.箭头函数 1.利用箭头函数自身不绑定this的特点; 2.render()方法中的this为组件实例,可以获取到setState(); class App extends ...
    99+
    2024-04-02
  • javascript中的this指向什么
    这篇文章主要介绍“javascript中的this指向什么”,在日常操作中,相信很多人在javascript中的this指向什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • 详解JavaScript原型对象的this指向问题
    目录一、this指向二、修改this指向1、call()方法2、apply()方法总结 一、this指向 构造函数中的this 指向实例对象。那么原型对象this的指向呢? 如下:...
    99+
    2024-04-02
  • 基于Vue中this.$options.data()的this指向问题
    目录this.$options.data()的this指向问题vue文档中有关于data的指向问题的解释vue骚操作之this.$options.data()重置vue组件的data...
    99+
    2024-04-02
  • javascript的this指向怎么理解
    本文小编为大家详细介绍“javascript的this指向怎么理解”,内容详细,步骤清晰,细节处理妥当,希望这篇“javascript的this指向怎么理解”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深...
    99+
    2024-04-02
  • c++中this指针指向什么
    this 指针在 c++ 中指向当前对象的实例。用法包括:访问成员变量:this->成员变量名调用成员函数:this->成员函数名()传递对象引用:作为参数传递给其他函数,以...
    99+
    2024-05-09
    c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作