javascript - 如何使用同一类的另一个方法更新构造函数中的状态?

标签 javascript reactjs

我有一个带有构造函数的组件:

<code lang="javascript">
class Day extends Component {
  constructor(props) {
    super(props);
    this.state = {
      calories: 0,
      fat: 0,
      protein: 0,
      carbs: 0,
    };

    this.caloriesCalculate();
  }
</code>

我有一个方法caloriesCalculate()。它有这样的代码:

<code lang="javascript">
caloriesCalculate() {

    var fat = 0;
    var protein = 0;
    var carbs = 0;
    var calories = 0;

    const { dataArray, mealPlan, date } = this.props;
    const { products } = dataArray;

    var timestamp = date._i/1000;
    Object.keys(mealPlan[timestamp]).map(function(type) {
      var product = products[mealPlan[timestamp][type]];
      fat += product.fat/1000;
      protein += product.protein/1000;
      carbs += product.carb/1000;
      calories += product.calories/1000;
    });

    var nutritions = {
      calories: calories,
      fat: fat,
      protein: protein,
      carbs: carbs,
    }

    this.setState(nutritions);
  }
</code>

当我将其分配给按钮单击时,该方法效果很好:

<code lang="javascript">
onClick={() => this.caloriesCalculate()}
</code>

但是如果该方法是从构造函数执行的,则状态的值为零。同时,如果我执行 console.log(nutritions);,它会在控制台中显示有效值,但在 render() 内部显示 - 零值。

在 render() 中我有这个:

<code lang="javascript">
<li className='day-calories'><b>Calories:</b> {calories}, <b>Fat:</b> {fat}g, <b>Protein:</b> {protein}g, <b>Carbs:</b> {carbs}g</li>
</code>

如果我将在构造函数中使用父组件的 props 中的值 - 它将进行相同的计算,但在父组件内部。

我可以在构造函数中进行计算 - 但这也是关于双重计算( onClick={() => this.caloriesCalculate()} - 它不是用于测试或用于调试,我使用此按钮和此方法)。

我做错了什么? 为什么 this.calculateCalories() 不从构造函数中获取有效数据?

最佳答案

您使用 setState - 在构造函数中是异步的,请尝试将函数调用移动到另一个生命周期,例如 componendDidMount

class Day extends Component {
  state = {
    calories: 0
    ...
  };

  componendDidMount = () => {
    this.caloriesCalculate();
  };

  caloriesCalculate = () => {
    // ... set nutritions
    this.setState(nutritions);
  };
}

Side Note: Avoid using var write more concise code.

关于javascript - 如何使用同一类的另一个方法更新构造函数中的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57128223/

相关文章:

css - MUI 进度指示器居中水平对齐

ReactJs:将数据获取代码或副作用移至 componentDidUpdate

javascript - 无法使用 Expo.io 在 IOS 上测试我的应用程序。找不到模块 hashAssetFiles

javascript - 添加两个没有操作按钮的数字react.js

javascript - 性能 - 功能组件中的功能

javascript - Node-Webkit 无法打开文件

javascript - 如何在 JavaScript 中暂停我的动画

javascript - 滚动背景动画

javascript - Socket.IO初始数据包

javascript - 如何在 JavaScript 中记录 DOM 样式