为什么react的组件要super(props)

为什么react的组件要super(props)

摘自 https://segmentfault.com/q/1010000008340434 (非原创)

如图,我知道supert是继承constructor的参数,但是为什么在react里面,有一些组件使用了super(props),而有一些没有写,还有在es6里就只是写了supert(),这些区别在哪呢?以及这里的这个constructor(props)...super(props)是起到什么作用呢

这个是全代码:

已采纳

  1. 调用super的原因:在ES6中,在子类的constructor中必须先调用super才能引用this
  2. super(props)的目的:在constructor中可以使用this.props
  3. 最后,可以看下React文档,里面有一段

Class components should always call the base constructor with props.

zhangfe1k 声望

原来如此,谢谢了。

— any· 2月14日

1

根本原因是constructor会覆盖父类的constructor,导致你父类构造函数没执行,所以手动执行下。

— brook· 2月18日

假设在es5要实现继承,首先定义一个父类:

//父类
function sup(name) {
    this.name = name
}
//定义父类原型上的方法
sup.prototype.printName = function (){
    console.log(this.name)
}

现在再定义他sup的子类,继承sup的属性和方法:

function sub(name,age){
    sup.call(this,name)    //调用call方法,继承sup超类属性
    this.age = age
}    

sub.prototype = new sup   //把子类sub的原型对象指向父类的实例化对象,这样即可以继承父类sup原型对象上的属性和方法
sub.prototype.constructor = sub    //这时会有个问题子类的constructor属性会指向sup,手动把constructor属性指向子类sub
//这时就可以在父类的基础上添加属性和方法了
sub.prototype.printAge = function (){
    console.log(this.age)
}

这时调用父类生成一个实例化对象:

    let jack = new sub(‘jack‘,20)
    jack.printName()    //输出 : jack
    jack.printAge()    //输出 : 20

这就是es5中实现继承的方法。
而在es6中实现继承:

    class sup {
        constructor(name) {
            this.name = name
        }

        printName() {
            console.log(this.name)
        }
    }

class sub extends sup{
    constructor(name,age) {
        super(name)
        this.age = age
    }

    printAge() {
        console.log(this.age)
    }
}

let jack = new sub(‘jack‘,20)
    jack.printName()    //输出 : jack
    jack.printAge()    //输出 : 20

对比es5和es6可以发现在es5实现继承,在es5中实现继承:

  1. 首先得先调用函数的call方法把父类的属性给继承过来
  2. 通过new关键字继承父类原型的对象上的方法和属性
  3. 最后再通过手动指定constructor属性指向子类对象

而在es6中实现继承,直接调用super(name),就可以直接继承父类的属性和方法,所以super作用就相当于上述的实现继承的步骤,不过es6提供了super语法糖,简单化了继承的实现

— yuchav· 7月29日

为什么最后再通过手动指定constructor属性指向子类对象

— happyhuizai· 1 天前

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

class HelloMessage extends React.Component{
    render (){
        return (
            <div>nice to meet you! {this.props.name}</div>
        );
    }
}
//不过这种只是用render的情况,使用一般的ES6函数写会更简便:
const HelloMessage = (props)=>(
    <div>nice to meet you! {this.props.name}</div>
)
时间: 2024-10-09 08:30:11

为什么react的组件要super(props)的相关文章

从 0 到 1 实现 React 系列 —— 组件和 state|props

看源码一个痛处是会陷进理不顺主干的困局中,本系列文章在实现一个 (x)react 的同时理顺 React 框架的主干内容(JSX/虚拟DOM/组件/...) 项目地址 组件即函数 在上一篇 JSX 和 Virtual DOM 中,解释了 JSX 渲染到界面的过程并实现了相应代码,代码调用如下所示: import React from 'react' import ReactDOM from 'react-dom' const element = ( <div className="titl

React 的组件与 this.props对象

1.组件 React 允许将代码封装成组件,然后像插入普通 HTML 标签一样,在网页中插入这个组件.React.createClass 的方法就是用于生成一个组件类. 2.this.props对象 即是对组件标签中的标签属性和子节点构成的集合. 控制台显示为 注:this.props.children 的值有3种可能:即当前组件没有字节点时,它就是undefined:如果有一个子节点,数据类型是object:如果有多个子节点时,数据类型就是array.所以处理this.props.childr

React Native组件、生命周期及属性传值props详解

创建组件的三种方式 第一种:通过ES6的方式创建 /** * 方式一 :ES6 */ export default class HelloComponent extends Component { render (){ return <Text style={{fontSize:20,backgroundColor:'red'}}>Hello</Text> } } 第二种:通过ES5的方式创建 /** * 方式二:ES5 */ var HelloComponent= React.c

Node.js 之react.js组件-Props应用

render props是指一种在 React 组件之间使用一个值为函数的 prop 共享代码(个人理解:将组件进行函数化,通过调用组件名实现,组件的利用,以元素的形式调用,并渲染画面) 具有 render prop 的组件接受一个函数,该函数返回一个 React 元素并调用它而不是实现自己的渲染逻辑. 具体实例(代码来自官网):URL:https://zh-hans.reactjs.org/docs/render-props.html#___gatsby 笔记:代码中实现的组件调用,是将一个组

React中constructor(props){}究竟是什么,以及super(props)与super()

定义class组件,为什么需要加上 super() ? 我们尝试去掉 super() 看看编译的结果: constructor() { this.state = {searchStr: ''}; this.handleChange = this.handleChange.bind(this); } 编译错误: 提示没有在this之前加上super() 其实就是少了super(),导致了this的 Reference Error class MyComponent extends React.Co

react中constructor和super()以及super(props)的区别。

react中这两个API出镜率超级高,但是一直不太懂这到底是干嘛的,有什么用:今天整理一下,方便自己查看同时方便大家. 1.constructor( )-----super( )的基本含义 constructor( )--构造方法 这是ES6对类的默认方法,通过 new 命令生成对象实例时自动调用该方法.并且,该方法是类中必须有的,如果没有显示定义,则会默认添加空的constructor( )方法. super( ) --继承 在class方法中,继承是使用 extends 关键字来实现的.子类

如何理解react中的super(),super(props)

用es6的class(类)的方法创建组件: 子类继承父类的属性:需要使用super()继续父类的属性,同时创建this(子类本身没有this); 如果像上图一样需要定义props的属性 this.props.xixi="哈哈",则需要用 super(props) 如果不定义props的属性,只定义状态this.state ,就可以直接super(); 这是为什么呢? 其实很简单,因为this.props必须要是一个对象,才能在它下面定义属性 而constructor(props){}传

React学习—组件

一.定义 组件就像JavaScript的函数.组件可以接收任意输入(称为"props"), 并返回 React 元素,用以描述屏幕显示内容. 二.组件的分类 1.函数式组件(无状态组件) 它是为了创建纯展示组件,这种组件只负责根据传入的props来展示,不涉及到要state状态的操作.在大部分React代码中,大多数组件被写成无状态的组件,通过简单组合可以构建成其他的组件等:这种通过多个简单然后合并成一个大应用的设计模式被提倡. function Welcome(props) { re

【05】react 之 组件state

1.1.  状态理解 React的数据流:由父节点传递到子节点(由外到内传递),如果顶层组件某个prop改变了,React会向下传递,重新渲染所有使用过该属性的组件.除此之外React 组件内部还具有自己的状态,这些状态只能在组件内部修改.通过与用户的交互(点击),实现不同状态(显示.隐藏.数量增加...),然后渲染UI,让用户界面和数据保持一致.React中只需更新组件的state,然后根据新的 state 重新渲染用户界面. this.props  属性:由父节点传入到组件内部,只读,不可修