constructor()、super()、super(props)

使用es6的class定义react组件时,经常会看到下面的代码:

constructor(props) {
  super(props);
  ...
}

通常会有两个疑问:

  1. 必须要调用super()吗?
  2. super()与super(props)有什么不同?

一、第一个问题

先说结论:

只要存在constructor就要调用super()

但是,不是每个react组件都需要constructor,比如下面的代码是可以正常运行的:

class App extends React.Component {
  render() {
    return (
      <h1>{this.props.text}</h1>
    );
  }
}

很多时候需要在constructor中访问this:

constructor() {
  console.log(this); --- Syntax error: 'this' is not allowed before super()
}

这是因为当没有调用super()时,this还没有被初始化,所以不能使用;那如果我不使用this呢?

constructor() {
--- Syntax error: missing super() call in constructor
}

es6会在语法层面强制你调用super(),所以得到的结论就是:<b>只要存在constructor就必须调用super()</b>

二、第二个问题

第一个问题已经回答了什么时候调用super(),那什么时候必须要调用super(props)呢?先说结论:

当需要在constructor中访问<b>this.props</b>的情况下

从上面的代码可以看出,即使没有constructor,依然可以在render中使用this.props,这是因为react在初始化class后,会将props自动设置到this中,所以在任何地方都可以直接访问this.props,除了一个地方:<b>constructor</b>

constructor(props) {
  super();
  console.log(this.props); --- undefined
}

所以当你需要在constructor中访问this.props时,才需要设置super(props)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容