在构造函数中声明React状态,而不是在构造函数之外

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在构造函数中声明React状态,而不是在构造函数之外相关的知识,希望对你有一定的参考价值。

在构造函数中声明state有什么区别吗?

我在这里有一个组件的例子:

class BurgerBuilder extends Component {
  state = {
    ingredients: {
      salad: 0,
      bacon: 0,
      cheese: 0,
      meat: 0
    },
    totalPrice: 30
  };
  ....
}

这里我只声明一个名为state的变量,它包含组件的变量,但我不会调用构造函数。

我在哪里声明:

class BurgerBuilder extends Component {
  constructor() {
    super();
    this.state = {
      ingredients: {
        salad: 0,
        bacon: 0,
        cheese: 0,
        meat: 0
      },
      totalPrice: 30
    };
  }
  ....
}

我发现,我可以使用this.setState作为两种解决方案,并且我的项目没有真正的区别。是否有最好的做法,在哪里使用。

答案

有什么区别吗?有什么最好的做法,在哪里使用?

它们几乎是一样的。在没有state的情况下声明contructor()的语法是syntactic sugar


你在第一个例子中使用的是Class field declarations。 (该提案于2017年7月达到第3阶段)。

简而言之,这个提议允许我们使用更简单的语法来声明类字段,而不需要constructor()

例如,这些代码是使用ES2015编写的

class Counter extends htmlElement {
  constructor() {
    super();
    this.onclick = this.clicked.bind(this);
    this.x = 0;
  }

  clicked() {
    this.x++;
    window.requestAnimationFrame(this.render.bind(this));
  }

  connectedCallback() { this.render(); }

  render() {
    this.textContent = this.x.toString();
  }
}
window.customElements.define('num-counter', Counter);

通过使用Class field declarations,他们将是这样的:

class Counter extends HTMLElement {
  x = 0;

  clicked() {
    this.x++;
    window.requestAnimationFrame(this.render.bind(this));
  }

  constructor() {
    super();
    this.onclick = this.clicked.bind(this);
  }

  connectedCallback() { this.render(); }

  render() {
    this.textContent = this.x.toString();
  }
}
window.customElements.define('num-counter', Counter);

使用此语法的好处:

通过预先声明字段,类定义变得更加自我记录;实例经历较少的状态转换,因为声明的字段始终存在。


参考:Class field declarations for JavaScript

以上是关于在构造函数中声明React状态,而不是在构造函数之外的主要内容,如果未能解决你的问题,请参考以下文章

将变量声明为“类”数据类型,而不调用“类”构造函数?

使用构造函数与 state = 在反应组件中声明状态有啥区别?

访问应用程序其他部分的构造函数中声明的类变量(React)

为啥 sql 数据库不允许为所有查询创建函数而不是在调用程序中构造 sql 字符串?

React 之 render props 的理解

为啥在类构造函数中使用 setState 方法时 React 会抛出错误?