React app,componentDidUpdate - 跳转列表,无限循环

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了React app,componentDidUpdate - 跳转列表,无限循环相关的知识,希望对你有一定的参考价值。

我有反应。我想在url中切换id。选项卡中的每次单击都应显示不同类型的产品列表。我使用方法componentDidUpdate。问题是,当我单击下一个选项卡时,列表会多次从上一个列表跳到当前列表。我已经读过在方法componentDidUpdate中使用setState可能会出现问题,并且它可能导致无限循环。我尝试了不同的事情,但我不知道,我的代码应该改变什么。你有什么想法,如何解决这个跳跃的事情?

  constructor(props) {
    super(props);
    this.state = {
      food: []
    };
    var ingredient_type = this.props.params.id;

    fetch('/food/type/'+ingredient_type)
      .then(res => res.json())
      .then(food=> this.setState({food}));
  }


   componentDidUpdate(){
   var ingredient_type = this.props.params.id;

    return fetch('/food/type/'+ingredient_type)
      .then(res => res.json())
      .then(food=> this.setState({food}));
  }



    render() { 
      let product_list = this.state.food.map((product, id) => <div className="row" key={id}> 
                                  <p  className="cal_list col-lg-4 col-md-4 col-sm-4" >{product.name}</p> 
                                  <p  className="cal_list1 col-lg-2 col-md-2 col-sm-2" >{product.calories}</p> 
                                  <p  className="cal_list2 col-lg-2 col-md-2 col-sm-2" >{product.protein}</p> 
                                  <p  className="cal_list3 col-lg-2 col-md-2 col-sm-2" >{product.fat}</p>
                                  <p  className="cal_list4 col-lg-2 col-md-2 col-sm-2" >{product.carb}</p> </div>)
答案

这就是我处理你的情况的方法:

constructor(props) {
  super(props);
  this.state = {
    food: []
  };
}

componentDidMount() {
  fetchFood(this.props.params.id)
}

componentDidUpdate(prevProps) {
  if(this.props.params.id !== prevProps.params.id) {
    fetchFood(this.props.params.id)
  }
}

fetchFood(id) {
  return fetch('/food/type/'+id)
    .then(res => res.json())
    .then(food=> this.setState({food}));
}

render() {
  ...
}

主要区别在于您只需要在获取数据之前检查id是否已更改。我还将初始提取从构造函数移动到componentDidMount。通常希望将副作用和setState调用保留在构造函数之外,即使在异步时也是如此。

以上是关于React app,componentDidUpdate - 跳转列表,无限循环的主要内容,如果未能解决你的问题,请参考以下文章

第一次安装组件后 componentDidUpdate 未触发(React)

React 16:componentDidUpdate 警告:安排了级联更新

componentDidUpdate 没有触发

react 性能优化之 componentWillReceiveProps & componentDidUpdate

react 性能优化之 componentWillReceiveProps & componentDidUpdate

react native中componentdidmount和componentdidupdate之间的区别是什么