当前位置: 首页 > 知识库问答 >
问题:

构造函数(props)和super(props)与React中的构造函数()和super()的比较

公冶智刚
2023-03-14

我知道这个问题被问了很多次,但仍然不清楚。很多人刚才说,

如果您想访问this.props,请将道具传递给构造函数

答案的另一个例子

Oficial doc说类组件应该始终使用props调用基构造函数,但如果我们不将props传递给constructor,我们仍然会将this.props放在除构造函数之外的所有地方。

同样从react源代码中,我们可以看到react.Component函数ReactComponent(props,context){this.props=props;this.context=context;}

但这更让我困惑super()应使用两个参数调用:propscontext。但是我们调用了super-empty,仍然可以访问两个this.props。根据ECMA文档super()调用父constructor(),并将参数传递给super()。但是我们的super()是空的。

因此,我的问题是:

  1. 为什么官方文件说:

类组件应始终使用props调用基构造函数。

共有2个答案

郭洋
2023-03-14

如果代码中没有为react组件定义构造函数,则可以假定它将自动绑定到后台,例如:

constructor(props){
    super(props);
}

一旦你明确定义了一个构造函数,你必须记住总是把代码放进去,否则它会被忽略...

欧阳鸿德
2023-03-14

以下是丹·阿布拉莫夫的回答:

但是,如果我们不将道具传递给构造函数,那么除了构造函数之外,我们仍然到处都有这个.props。

是的,在构造函数运行后,React设置这个.props。不过,让这个.props在某些地方起作用而在其他地方不起作用还是令人困惑的。尤其是当构造函数和其他方法都调用某个读取this.props的共享方法时。因此,为了避免任何潜在的混淆,我们建议始终调用super(props)

此外,从CreateElement的源代码中,您可以看到,无论您使用超级(props)createElement都会添加props

createElement()与此问题无关。它创建一个元素,而不是一个实例。

因此,回到您的问题,从技术上讲,只有当您计划访问构造函数中的this.props或从构造函数中调用的任何方法时,才有必要使用它。然而,要记住这一点是相当令人困惑的。您可能知道这一点,并且不会调用super(props),但是您的团队中的下一个人将希望在构造函数中访问这个.props,并且会惊讶于它不起作用。总是指定它来避免这些问题更容易。

 类似资料:
  • 问题内容: 我正在阅读一些代码。在构造函数中,它具有super(),但类实现的接口当然没有构造函数。那么它指的是哪个super()? 问题答案: 指扩展(不是已实现的接口)。在这种情况下是 因此它将在中调用构造函数(不执行任何操作)

  • 问题内容: 我意识到super关键字可用于调用父组件中的函数。但是,我不清楚您为什么在下面的示例中使用super关键字-只是将传递给构造器的所有prop传递给它。 有人可以回应一下在ES6类构造函数中使用super关键字的各种原因吗? 问题答案: super允许您访问父类的构造方法。包含props的唯一原因是在构造函数内部访问this.props。 使用es6类时,React中的“ super()

  • 请帮我从这段代码中查找错误。我还是新手,我不知道这是否正确。我确实有一个错误。这就是错误:类Person中的构造函数Person不能应用于给定类型;super();^requiredent:String,String,String找到:没有参数原因:实际和正式参数列表长度不同这是我的代码: 编辑:如果我对Person和Address类都这样做。我只能有三个ARG构造函数。如何调用one-arg构造

  • 问题内容: 代码是什么 在构造函数内部吗? 例如,这是我的课程的构造函数 它和超类有关吗? 问题答案: 它调用父类的构造函数

  • 问题内容: 从文档中学习React 并遇到以下示例: 根据Mozilla的说法,super允许您在构造函数中使用。是否有其他原因可以单独使用(我知道也可以访问父类的方法),但是使用React时,是否还有其他仅通过自身调用的用例? 问题答案: 仅在具有构造函数的React组件内部被调用。例如,以下代码不需要超级: 但是,如果我们有一个构造函数,那么它是强制性的: 之所以不能被允许之前的原因是因为未调

  • 这个Super()的替代品是什么;我代码中的语句...因为它向我显示了一个名为:构造函数调用必须是构造函数中的第一个语句的错误。