使用 es6 类时,React 中的“super()”和“super(props)”有什么区别?
何时将
props
传递给
super()
很重要,为什么?
class MyComponent extends React.Component {
constructor(props) {
super(); // or super(props) ?
}
}
只有一种情况需要将
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', … }
}
}
请注意,传递或不传递
props
给
super
对以后在
constructor
之外使用
this.props
均
无影响
。也就是说,
render
、
shouldComponentUpdate
或事件处理程序
始终
可以访问它。
Sophie Alpert 在对类似问题的 回答 中明确提到了这一点。
文档— 状态和生命周期、向类添加本地状态、指向2 —建议:
Class components should always call the base constructor with
props
.
但是,没有提供任何理由。我们可以推测这要么是因为子类化,要么是为了未来的兼容性。
(感谢@MattBrowne 提供的链接)
在此示例中,您正在扩展
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
。
当您将
props
传递给
super
时,props 会被分配给
this
。请看以下场景:
constructor(props) {
super();
console.log(this.props) //undefined
}
但是当您这样做时:
constructor(props) {
super(props);
console.log(this.props) //props will get logged.
}