用React组件理解构造函数

来自菜鸟教程
跳转至:导航、​搜索

构造函数是在从类创建对象期间自动调用的方法。 它可以处理您的初始设置,例如默认对象的某些属性,或者检查传入的参数。 简单地说,构造函数有助于构造事物。

在 React 中,构造函数也不例外。 它可用于将事件处理程序绑定到组件和/或初始化组件的本地状态。 constructor() 方法在组件挂载之前被触发,并且像 React 中的大多数东西一样,在使用它们时应该遵循一些规则。

在使用 this.props 之前调用 super(props)

由于构造函数的性质,一开始 this.props 对象不可用并且可能导致错误。 这个构造函数会抛出一个错误:

constructor() {
  console.log(this.props);
}

相反,我们从 constructor() 中获取 props 值并将其传递给 super() 方法:

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

当你调用 super() 方法时,它会调用父类的构造函数,在 React 组件的情况下是 React.Component

切勿在 constructor() 内部调用 setState()

组件的构造函数是设置组件初始状态的理想场所。 不要像在类中的其他方法中那样使用 setState() ,而是需要直接设置初始状态:

constructor(props) {
  super(props);

  this.state = {
    reptile: 'alligator',
    color: '#008f68',
  };
}

构造函数是唯一应该像这样直接分配本地状态的地方。 我们组件中的任何其他地方,你应该依赖 setState() 代替。

避免将值从 this.props 分配到 this.state

在构造函数中设置初始组件状态时,应尽量避免从属性中设置值。

当你做这样的事情时:

constructor(props) {
  super(props);

  this.state = {
    reptile: props.reptile,
  };
}

您稍后将无法运行 setState() 并更新属性。

您可以通过调用 this.props.reptile 在代码中直接引用该属性,而不是将属性直接分配给状态。

将事件全部绑定在一个地方

不是真正的规则或陷阱,但值得注意的是,您可以轻松地在构造函数中绑定事件处理程序:

constructor(props) {
  super(props);

  this.state = {
    // Sets that initial state
  };

  // Our event handlers
  this.onClick = this.onClick.bind(this);
  this.onKeyUp = this.onKeyUp.bind(this);
  // et cetera...
}

避免在 constructor() 中使用副作用或订阅

我明白了,您刚刚构建了一个新组件,您希望它从 API 中提取数据并将值设置为状态。 在组件安装之前,在构造函数中执行此操作非常有意义,对吧?

错误的!

对于会更新状态和其他副作用的订阅,您应该将逻辑放在 componentDidMount() 中,它会在组件安装后立即触发,如果您更新状态不会给您带来任何麻烦在里面。

你甚至需要一个构造函数吗?

构造函数非常方便,但有时它太多了。 如果您不打算在组件中维护状态并且不绑定任何事件处理程序,则根本不需要定义构造函数。

事实上,如果您不需要状态或事件处理程序,您可能根本不需要基于类的组件。 您可以节省一点额外的打字,只需使用功能组件