如何使用setState更新对象数组中的对象

Rad*_*dex 2 javascript ecmascript-6 reactjs

我正在使用React,我的状态定义为对象数组。我只需要更改state.data数组中一个特定元素,即ID为1的示例对象。

我想知道:

  • setState()在这种情况下如何使用正确的方法是什么。

constructor(props) {
  super(props);
  this.state = {
    data: [{
        id: 0,
        title: 'Buy a',
        status: 0, // 0 = todo, 1 = done
      },
      {
        id: 1,
        title: 'Buy b',
        status: 0,
      },
      {
        id: 2,
        title: 'Buy c',
        status: 0,
      }
    ]
  };
  this.onTitleChange = this.onTitleChange.bind(this);
}
onTitleChange(id, title) {
  console.log(id, title);
  debugger
}
Run Code Online (Sandbox Code Playgroud)

Shu*_*tri 6

您可以使用传播运算符克隆状态对象,然后使用findIndex修改对象并设置状态的方法在具有给定id的数组中找到对象的索引。

constructor(props) {
  super(props);
  this.state = {
    data: [{
        id: 0,
        title: 'Buy a',
        status: 0, // 0 = todo, 1 = done
      },
      {
        id: 1,
        title: 'Buy b',
        status: 0,
      },
      {
        id: 2,
        title: 'Buy c',
        status: 0,
      }
    ]
  };
  this.onTitleChange = this.onTitleChange.bind(this);
}
onTitleChange(id, title) {
   var data = [...this.state.data];
   var index = data.findIndex(obj => obj.id === id);
   data[index].title = title;
   this.setState({data});
}
Run Code Online (Sandbox Code Playgroud)

  • 好答案。只是想向@Radex指出,应谨慎使用setState:不应在要更新组件的生命周期方法中调用onTitleChange函数(例如componentDidUpdate),因为否则会导致无限循环。事先检查此文档条目https://facebook.github.io/react/docs/state-and-lifecycle.html (2认同)