React的constructor super作用是什么?为什么要进行bind绑定?

【掰开揉碎】react中的super(props) React中,是在类组件的构造函数中调用super关键字的一部分,用于调用父类的构造函数,同时也会将props传递给父类的构造函数。让我们详细解释一下这个用法。 阅读详情

最近有些迷惑一个事情,就是在写react组件的时候,有时候写constructor,有时候不写,呃呃呃呃呃,虽然不起眼,但是这到底是一个什么机制呢,好好研究了一下,发现涉及到的东西还不少,这并不是出现在react的东西,而是涉及到类和继承的问题的,决定写下来总结一下。虽然对于使用并不影响,但是只知其然不知其所以然,慢慢就会变得迷茫。。。。
参考文章
Why Do We Write super(props)?
阮一峰:Class 的继承
为什么在React Component需要bind绑定事件
MDN类体和方法定义

1.constructor方法到底是啥?
MDN对类和构造函数的解释中说明

constructor方法是一个特殊的方法,这种方法用于创建和初始化一个由class创建的对象。
一个构造函数可以使用 super 关键字来调用一个父类的构造函数

2.写不写?

class Clock extends React.Component {
  constructor(props) {
    super(props);
    this.state = {date: new Date()};
  }
  render() {
    return (
      <div>
        <h1>Hello, world!</h1>
        <h2>It is {this.state.date.toLocaleTimeString()}.</h2>
      </div>
    );
  }
}

以上是react官网粘贴下来的代码,但是在实际写的时候,不写constructor,super也是没有问题的,并不会影响的执行。不写 constructor(props) {super(props);的部分,并不是我们在运行中不再运行了,如果子类没有定义constructor()方法,这个方法会默认添加,并且里面会调用super()。也就是说,不管有没有显式定义,任何一个子类都有constructor()方法。

class ColorPoint extends Point {
}
// 等同于
class ColorPoint extends Point {
  constructor(...args) {
    super(...args);
  }
}

3.如果写了constructor,就必须写super
如果只写了constructor,而不写super,使用this就会出现报错在这里插入图片描述
为什么子类的构造函数,一定要调用super()?原因就在于 ES6 的继承机制,与 ES5 完全不同。

ES5 的继承机制,是先创造一个独立的子类的实例对象,然后再将父类的方法添加到这个对象上面,即“实例在前,继承在后”。
ES6 的继承机制,则是先将父类的属性和方法,加到一个空的对象上面,然后再将该对象作为子类的实例,即“继承在前,实例在后”。这就是为什么 ES6 的继承必须先调用super()方法,因为这一步会生成一个继承父类的this对象,没有这一步就无法继承父类。

这意味着新建子类实例时,父类的构造函数必定会先运行一次。

另一个需要注意的地方是,在子类的构造函数中,只有调用super()之后,才可以使用this关键字,否则会报错。这是因为子类实例的构建,必须先完成父类的继承,只有super()方法才能让子类实例继承父类。

super虽然代表了父类A的构造函数,但是返回的是子类B的实例,即super内部的this指的是B的实例,因此super()在这里相当于A.prototype.constructor.call(this)。
4.加不加props?
只有一个理由需要传递props作为super()的参数,那就是你需要在构造函数内使用this.props
解释引自 What’s the difference between “super()” and “super(props)” in React when using es6 classes?

There is only one reason when one needs to pass props to super():
When you want to access this.props in constructor.
(Which is probably redundant since you already have a reference to it.)

 constructor(props){
        super(props)
        this.state = {
            name :this.props.name。//在constructor中访问 不加props会报错
        }
    }
    componentDidMount(){
        console.log(this.props.name) //不在constructor中 不加props不会报错
    }

写到这里,想起来一个事情,就是react中的函数推荐使用bind进行事件绑定,但是在使用箭头函数以后就不再需要再绑定了,大家都知道是因为this的指向发生了变化导致this报错,但是为什么会发生指向变化,this又指向了哪里呢?
5.react中的事件指向问题。
其实这个问题也是js的问题,令人用起来比较麻烦的this问题。最直接的一点就是谁调用this就会指向谁,具体问题再具体分析啦!

<button onClick={ this.handleClick } >Hello</button>

React 通过 React.createElement 方法模拟 document.createElement 来创建 DOM(当然React创建的是虚拟DOM)。 属性中 onClick 指向 this.handleClick 方法,看起来都没有问题。
但是render方法中被Babel编译后的样子:

 render() {
    return React.createElement(
      'button',
      { onClick: this.handleClick },
      'Hello'
    );
  }

此时的onClick即是中间变量,相当于把函数传递给了onClick这个变量,等点击的时候会调用方法,所以在调用的时候其实是谁调用onclick的问题,在React class组件中,在执行click事件时类似于 element.addEventListener(‘click’, callback, false),该callback失去了隐式绑定的上下文,指向了全局对象,严格模式下的this值为 undefined。
参考MDN中类的说明

当调用静态或原型方法时没有指定 this 的值,那么方法内的 this 值将被置为 undefined。即使你未设置 “use
strict” ,因为 class 体内部的代码总是在严格模式下执行。

所以要绑定this。使用bind或者使用箭头函数,使this绑定在当前的上下文。

React组件构造函数的核心职责与常见误区 构造函数是React组件中用于初始化实例状态和绑定this上下文的关键阶段,其本质是同步、无副作用的对象初始化逻辑。它不参与渲染、不触发副作用、不支持异步操作,核心价值在于保障state与props的初始一致性及上下文稳定性。理解super(props)如何确立this.props引用、this.state初始化为何必须避免直接赋值和引用共享,是规避白屏、状态错乱与内存泄漏等典型问题的技术前提。这些底层机制也构成了useState惰性初始化、闭包绑定与函数式更新设计的思想基础,广泛应用于表单控制、模态框状 阅读详情

相关推荐

多边形裁剪算法

多边形裁剪算法 刚参加工作就跟多边形刚上了,对于多边形的裁剪做一些简单的总结。 多边形裁剪主要有四种算法 Greiner-Hormann裁剪算法 Sutherland-Hodgman算法 Vatti裁剪算法 Weiler-Atherton裁剪算法 作为一名想要成为优秀算法工程师的程序员,我们不能只会使用,而不知道其原理,倘若如此,我们无法做到应用于本身业务上的定制化的修改。 Greiner–H...

papalqi 6704

reactconstructor( )和super( )详解

整理面试题,不是让大家去只刷面试题,而是熟悉目前实际面试中常见的考察方式和知识点,做到心中有数,也可以用来自查及完善知识体系。《前端基础面试题》,《前端校招面试题精编解析大全》,《前端面试题宝典》,《前端面试题:常用算法》PDF完整版点击这里即可获取!!!!典》,《前端面试题:常用算法》PDF完整版点击这里即可获取!!!!**[外链图片转存中…(img-O04P8yVh-1711720856823)][外链图片转存中…(img-9NINmmtv-1711720856823)]

2401_84004012的博客 2229

Xilinx XDMA IP核配置实战:AXI Memory Mapped vs Stream选型指南(附PCIe调试技巧)

本文深入解析Xilinx XDMA IP核配置中AXI Memory Mapped与AXI Stream两种DMA接口的核心区别与选型策略。针对PCIe高速数据传输场景,详细对比了二者在数据特性、延迟、硬件资源及软件复杂度上的差异,为FPGA工程师在数据采集、实时处理等项目中做出高效设计决策提供实战指南,并附有关键的PCIe调试技巧。

qsc901234的博客 549

React组件中的constructor 概述

react官网中,我们看到经常会有这样声明组件的,但是我们自己在写的时候很少会使用constructorsuper,那么这两个方法到底是用来做什么的呢?在写react中一定要写吗?我们在下面具体看一下: class Clock extends React.Component { constructor(props) { super(props); this.state = {date: new Date()}; } render() { return (

Wu_shuxuan的博客 1640

Cocos Creator物理引擎入门:从核心概念到实战配置与性能优化

物理引擎是游戏开发中实现真实交互的核心系统,它通过模拟现实世界的物理定律,为游戏对象赋予质量、速度、碰撞响应等动力学行为。其核心原理基于碰撞检测与物理响应两大模块,前者判断物体间的接触,后者计算碰撞后的运动状态变化。这项技术的价值在于将复杂的物理计算封装成易用的组件和API,极大降低了游戏开发中实现真实物理效果的门槛。在应用场景上,无论是2D平台的跳跃反馈、3D场景中的物体堆叠,还是AR/VR中的自然交互,都离不开物理引擎的支持。本文聚焦于Cocos Creator引擎,深入解析其内置的Bullet、Phy

weixin_34406086的博客 453

react基础篇(二)

注意:内联函数(即上例)的ref第一次渲染的时候会调用一次,之后更新的时候会调用两次,更新中的第一次为清空上一次的节点内容,此时的currentNode为null,第二次的时候才是正式更新,但是具体的影响并不大。原因:changeWeather不是实例调用的,而是render里面调用的,这里的this.changeWeather相当于直接调用。注意:实例身上的propTypes中p是小写的,限制类型的PropTypes中的p是大写的。弊端:结构错误,一般只有两大块,一块是创建组件,一块是渲染组件

zz_zz33的博客 551

Reactconstructor 作用

Reactconstructor 作用 react中的constructor大体有两个作用 1.初始化this.state 2.纠正方法的this的指向 constructor(props) { super(props); this.state = { counter: 0 }; //初始化state this.handleClick = this.handleClick.bind(this); // 事件绑定 } PS:1.初始化state可以通过属性的方法初始化,Babel(ES6转E

Aays2790的博客 4397

React里面的constructor()、super()、super(props)具体使用

由于,React是依赖于es6的Class,就是es5对象的语法糖。里面的constructor想当于对对象的初始化。 class Point { constructor(x, y) { this.x = x; this.y = y; } } let point = new Point(1,2); point.x === 1 //true point.y =...

qq_15732905的博客 326

reactconstructor这个构造函数有什么卵用

当你在React class中需要设置state的初始值或者绑定事件时,需要加上constructor(){} 官方Demo: class LikeButton extends React.Component { constructor() { super(); this.state = { liked: false }; this.ha...

banqiaoxian4609的博客 395

Reactconstructorsuper

如果你用到了constructor就必须写super(),是用来初始化this的,可以绑定事件到this上; 如果你在constructor中要使用this.props,就必须给super加参数:super(props); (无论有没有constructor,在render中this.props都是可以使用的,这是React自动附带的;) 如果没用到constructor,是可以不...

dibitui7403的博客 123

reactconstructor构造器的使用

reactconstructor构造器中的使用 在react组件内使用constructor构造器一般两种用途,应在其他语句之前使用super(props),否则在构造器内若要获取this.props会出现未定义。 对state状态进行初始赋值 在constructor内不应使用setState来改变state,应直接对this.state进行赋值 class Person extends React.Components { constructor(props){ super(props)

PengPeng1020的博客 1187

React 事件处理及 this 绑定问题

React 事件处理 React 事件是一个合成事件,JSX实际上是 React.createElement(component, props, ...children) 函数提供的语法糖表达方式,那么: // JSX 表达 <button onClick = {this.handleClick}> Click me </button> // 经转化为 React.cr...

zlq_CSDN的博客 417

React中类定义组件constructorsuper

刚开始学习React没多久,在老师的教程里看到了类组件的使用示例,但是和资料上有些冲突,而引发了一些疑问: 类组件中到底要不要定义构造函数constructor()? super()里边到底要不要传入props参数? 绑定事件到底要不要在构造函数constructor()中进行? 查找资料,总结如下: 类组件: 定义组件可以使用函数定义组件和类定义组件() (推荐一篇随笔,...

weixin_30709809的博客 603

解决React性能问题:tslint-reactjsx-no-lambda与jsx-no-bind规则实战

React性能优化是每个前端开发者必须掌握的技能!🚀 在React应用中,不当的事件处理函数定义方式是导致组件不必要重渲染的常见原因。今天,我将为您详细介绍如何使用tslint-reactjsx-no-lambda和jsx-no-bind规则来检测和修复这些性能问题,让您的React应用运行更加流畅高效。 ## 为什么React性能优化如此重要?✨ 在大型React应用中,组件的不必要重渲

gitblog_00767的博客 593

Reactconstructor(){}

当你在React class中需要设置state的初始值或者绑定事件时 需要加上constructor(){} [javascript] view plain copy constructor() {           this.state = {searchStr: ''};           this.handleChange 

aaa333qwe的博客 1479

react中的constructor方法的理解

之前在使用React创建类,都会写上constructor方法: constructor(props){ super(props); } 一直都有疑问?必须都这样写吗?看了网上的一篇文章,解开了疑惑: 原文链接 好记性不如烂笔头,记录一下吧! (1)constructor是否有必要写: ES5的继承,实质是先创造子类的实例对象this,然后再将父类的方法添加到this上。 ES...

u012149906的博客 2355

reactconstructor( )和super( )详解,web前端面试项目上的难点有哪些

上面的例子中,有super(),子类必须在constructor() 中调用 super() ,否则新建实例时会报错。报错的原因是:子类没有自己的 this 对象的,它只能继承自父类的 this 对象,然后对其进行加工,而 super() 就是将父类中的 this 对象继承给子类的。如果你看懂了,那么将会get到这项技能:构造方法constructor() = 构造函数本身 (上面我也进行了打印,你应该懂的)Doctype作⽤?super() = 继承,这玩意就是用来继承的,继承它的父级。

weixin_57992300的博客 1009

Reactconstructor方法及state状态

React组件看成是一个状态机(State Machines)。通过与用户的交互,实现不同状态,然后渲染 UI,让用户界面和数据保持一致。 React 里,只需更新组件的 state,然后根据新的 state 重新渲染用户界面(不要操作 DOM)。 以下实例创建一个名称扩展为 React.Component 的 ES6 类,在 render() 方法中使用 this.state 来修改当前...

蜗牛~~ 5639

react 中的 super(props) 作用

1、constructor() 这是ES6对类的默认方法,通过 new 命令生成对象实例时自动调用该方法。并且,该方法是类中必须有的,如果没有显示定义,则会默认添加空的constructor( )方法。 2、super() 在class方法中,继承是使用 extends 关键字来实现的。子类必须在 constructor( ) 调用 super() 方法,否则新建实例时会报错。报错的原因是:子类是没有自己的 this 对象的,它只能继承自父类的 this 对象,然后对其进行加工,而 super()..

m0_37557930的博客 3731

springboot-基于SpringBoot的城市公交管理系统

springboot-基于SpringBoot的城市公交管理系统

上一篇: JavaScript 运行机制 Event Loop 学习
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值