开发者问题收集

使用 es6 类时,React 中的“super()”和“super(props)”有什么区别?

2015-06-01
268921

何时将 props 传递给 super() 很重要,为什么?

class MyComponent extends React.Component {
  constructor(props) {
    super(); // or super(props) ?
  }
}
3个回答

只有一种情况需要将 props 传递给 super()

当您想在构造函数中访问 this.props 时。

传递:

class MyComponent extends React.Component {    
    constructor(props) {
        super(props)

        console.log(this.props)
        // -> { icon: 'home', … }
    }
}

未传递:

class MyComponent extends React.Component {    
    constructor(props) {
        super()

        console.log(this.props)
        // -> undefined

        // Props parameter is still available
        console.log(props)
        // -> { icon: 'home', … }
    }

    render() {
        // No difference outside constructor
        console.log(this.props)
        // -> { icon: 'home', … }
    }
}

请注意,传递或不传递 propssuper 对以后在 constructor 之外使用 this.props 无影响 。也就是说, rendershouldComponentUpdate 或事件处理程序 始终 可以访问它。

Sophie Alpert 在对类似问题的 回答 中明确提到了这一点。


文档— 状态和生命周期、向类添加本地状态、指向2 —建议:

Class components should always call the base constructor with props .

但是,没有提供任何理由。我们可以推测这要么是因为子类化,要么是为了未来的兼容性。

(感谢@MattBrowne 提供的链接)

Robin Pokorny
2016-01-25

在此示例中,您正在扩展 React.Component 类,并且根据 ES2015 规范,子类构造函数在调用 super() 之前不能使用 this ;此外,如果 ES2015 类构造函数是子类,则必须调用 super()

class MyComponent extends React.Component {
  constructor() {
    console.log(this); // Reference Error
  }

  render() {
    return <div>Hello {this.props.name}</div>;
  }
}

相比之下:

class MyComponent extends React.Component {
  constructor() {
    super();
    console.log(this); // this logged to console
  }

  render() {
    return <div>Hello {this.props.name}</div>;
  }
}

更多详细信息请参阅 这个出色的 Stack Overflow 答案

您可能会看到通过扩展 React.Component 类创建的组件示例,这些组件不会调用 super() ,但您会注意到这些组件没有 constructor ,因此没有必要。

class MyOtherComponent extends React.Component {
  render() {
    return <div>Hi {this.props.name}</div>;
  }
}

我从与我交谈过的一些开发人员那里看到的一个令人困惑的点是,没有 constructor 的组件因此不会在任何地方调用 super() ,但仍然有 this.props 可在 render() 方法中使用。请记住,此规则以及需要为 constructor 创建 this 绑定仅适用于 constructor

Dave
2015-12-03

当您将 props 传递给 super 时,props 会被分配给 this 。请看以下场景:

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

但是当您这样做时:

constructor(props) {
    super(props);
    console.log(this.props) //props will get logged.
}
Nahush Farkande
2016-09-08