为了账号安全,请及时绑定邮箱和手机立即绑定

React setState 数组未排序

React setState 数组未排序

FFIVE 2021-11-18 16:06:06
我的代码是这样的:handleFavourite = id => {    const { restaurants } = this.state;    let newRestaurants = [...restaurants];    newRestaurants = sort(newRestaurants, 'favourite');    console.log(newRestaurants); // ALL GOOD    this.setState({ restaurants: newRestaurants }, () => console.log(this.state.restaurants)); // CONSOLE LOG POSTS OLD DATA};所以在那里。回调函数setState显示旧数据,在 UI 中也没有任何东西被排序。为什么会这样?编辑:发现问题。我也在使用static getDerivedStateFromProps,它每次都重置状态。
查看完整描述

3 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

我会检查一下this.state.restaurantscomponentDidUpdate因为这是查看您的组件是否已更新的最佳方式。

这感觉就像你正在做正确的事情,如果你的第一个日志确实是正确的(似乎一种奇怪的方式来排序给我,我会打电话array.sort()newRestaurants)。

也许在您的组件更新后的某个地方,某些东西将餐厅重新设置为原始值。


查看完整回答
反对 回复 2021-11-18
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

 newRestaurants = sort(newRestaurants, 'favourite');

这会改变原始数组并且不会创建新副本。

一种解决方法是使用 slice 函数创建一个新副本

newRestaurants = sort(newRestaurants, 'favourite').slice(); 
this.setState({ restaurants: newRestaurants });


查看完整回答
反对 回复 2021-11-18
?
慕容3067478

TA贡献1773条经验 获得超3个赞

handleFavourite 似乎工作正常


class App extends React.Component {

  state = {

    restaurants: ["a", "b", "c"]

  }

  

  handleFavourite = id => {

    const { restaurants } = this.state;

    let newRestaurants = [...restaurants];

    newRestaurants = sort(newRestaurants, 'favourite');

    console.log(newRestaurants); // ALL GOOD

    this.setState({ restaurants: newRestaurants }, () => console.log(this.state.restaurants)); // CONSOLE LOG POSTS OLD DATA

}


render() {

  const restaurants = this.state.restaurants.map(r => <p>{r}</p>)

  return (

    <div>

      {restaurants}

    <hr/>

    <button onClick={this.handleFavourite}>sort</button>

    </div>

  )

}

}


function sort(r) {

  return r.reverse();

}


ReactDOM.render(<App/>, document.getElementById("root"))

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

<div id="root"></div>


查看完整回答
反对 回复 2021-11-18
  • 3 回答
  • 0 关注
  • 138 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信