【 React 】super()和super(props)有什么区别

相关文章 react 中的 super super(props)

1. ES6类

在ES6中,通过extends关键字实现类的继承,方式如下:

javascript 复制代码
class sup{
    constructor(name){
        this.name=name;
    }
    printName(){
        console.log(this.name)
    }
}
class sub extends sup{
    constructor(name,age){
        super(name) //super 代表的是父类的构造函数
        this.age=age;
    }
    printAge(){
        console.log(this.age)
    }
}
let rui=new sub('rui',21);
rui.printAge() //21
rui.printName() //rui

在上面的例子在子中,可以看到通过super关键字实现调用父类,super代替的是父类的构建函数,使用super(name)相当于调sup.prototype.constructor.call(this.name)

如果在子类中不使用super关键字,则会引发报错
报错的原因是 子类没有自己的this对象,它只能继承父类的this对象,然后对其进行加工而super()就是将父类中的this对象继承给子类的,没有super()子类就得不到this对象

如果先调用this ,再初始化super(),同样是禁止的行为
所以在子类的constructor 中 ,必须先用super 才能引用this

2. 类组件

在React中,类组件是基于es6的规范实现的,继承React.Component,因此如果用到constructor就必须写super()才初始化this

这时候,在调用super()的时候,我们一般都需要传入props作为参数,如果传不进去,React内部也会将其定义在组件实例中

javascript 复制代码
// React 内部
const instance = new YourComponent(props);
instance.props = props;

所以无论有没有constructor,在render中this.props都是可以使用的,这是React自动附带的,是可以不写的

javascript 复制代码
class HelloMessage extends React.Component{
    render(){
        return <div>hello {this.props.name}</div>
    }
}

但是也不建议使用super()代替super(props)

因为在React会在类组件构造函数生成实例后再给this.props附值,所以 不传递props在super的情况下,调用this.props为undefined,情况如下:

javascript 复制代码
class Button extends React.Component{
    constructor(props){
        super() //没传入props
        console.log(props) //{}
        console.log(this.props) //undefined
    }
}

而传入props的则都能正常访问,确保了this.props在构造函数执行完毕之前已经被赋值,更符合逻辑

javascript 复制代码
class Button extends React.Component{
    constructor(props){
        super(props) /
        console.log(props) //{}
        console.log(this.props) //{}
    }
}

3. 总结

在React 中,类组件基于ES6,所以在constructor中必须使用super
在调用super过程,无论是否传入props,React内部都会将props赋值给组件实例props属性中,如果调用了super(),那么this.props在super和构造函数结束之间仍然是undefined

相关推荐
方也_arkling9 分钟前
别名路径联想提示。@/统一文件路径的配置
前端·javascript
毕设源码-朱学姐12 分钟前
【开题答辩全过程】以 基于web教师继续教育系统的设计与实现为例,包含答辩的问题和答案
前端
qq_1777673717 分钟前
React Native鸿蒙跨平台剧集管理应用实现,包含主应用组件、剧集列表、分类筛选、搜索排序等功能模块
javascript·react native·react.js·交互·harmonyos
qq_1777673723 分钟前
React Native鸿蒙跨平台自定义复选框组件,通过样式数组实现选中/未选中状态的样式切换,使用链式调用替代样式数组,实现状态驱动的样式变化
javascript·react native·react.js·架构·ecmascript·harmonyos·媒体
web打印社区26 分钟前
web-print-pdf:突破浏览器限制,实现专业级Web静默打印
前端·javascript·vue.js·electron·html
RFCEO1 小时前
前端编程 课程十三、:CSS核心基础1:CSS选择器
前端·css·css基础选择器详细教程·css类选择器使用方法·css类选择器命名规范·css后代选择器·精准选中嵌套元素
烬头88211 小时前
React Native鸿蒙跨平台采用了函数式组件的形式,通过 props 接收分类数据,使用 TouchableOpacity实现了点击交互效果
javascript·react native·react.js·ecmascript·交互·harmonyos
Amumu121381 小时前
Vuex介绍
前端·javascript·vue.js
We་ct1 小时前
LeetCode 54. 螺旋矩阵:两种解法吃透顺时针遍历逻辑
前端·算法·leetcode·矩阵·typescript
2601_949809591 小时前
flutter_for_openharmony家庭相册app实战+相册详情实现
javascript·flutter·ajax