在react中更新状态时递归太多

IT技术 javascript reactjs
2021-05-21 08:27:53

在此示例中,当我尝试在componentDidUpdate生命周期回调期间更新状态时,出现too much recursion错误。我应该如何更新状态?

import React from 'react';

class NotesContainer extends React.Component {
  constructor(props) {
    super(props);
    this.state = { listOfShoppingItems: [] };
  }

  componentDidUpdate(nextProps, nextState) {
    let newShoppingItems = this.calculateShoppingItems();
    this.setState({ listOfShoppingItems: newShoppingItems });
  }

  calculateShoppingItems() {
    let shoppingItemsCart = []

    if (this.props.milk < 3) {
      let value = "Buy some milk";
      shoppingItemsCart.push(value);
    }

    if (this.props.bread < 2) {
      let value = "Buy some bread";
      shoppingItemsCart.push(value);
    }

    if (this.props.fruit < 10) {
      let value = "Buy some fruit";
      shoppingItemsCart.push(value);
    }

    if (this.props.juice < 2) {
      let value = "Buy some juice";
      shoppingItemsCart.push(value);
    }

    if (this.props.sweets < 5) {
      let value = "Buy some sweets";
      shoppingItemsCart.push(value);
    }

    return shoppingItemsCart;
  }

  render() {
    return (
      <div>
        Etc...
      </div>
    );
  }
}

export default NotesContainer;
1个回答

componentDidUpdate当 props 或 state 改变时触发。如果您在此方法中更改状态,则会导致无限循环(除非您实现shouldComponentUpdate)。

当您收到新props时,您的状态componentWillReceiveProps似乎会发生变化,因此似乎是个好地方。文档

当组件接收新的 props 时调用。初始渲染不会调用此方法。

以此为契机,在render()通过使用this.setState(). 旧的 props 可以通过 this.props 访问。this.setState()在此函数内调用不会触发额外的渲染。