如何更新组件状态中的对象数组?

时间:2018-05-27 15:17:36

标签: javascript arrays reactjs object

我正在尝试更新存储在数组中的对象的属性。

我的州看起来像这样:

state = {
  todos: [
    {
     id: '1',
     title: 'first item,
     completed: false
    },
    {
     id: '2',
     title: 'second item,
     completed: false
    }
  ],
}

我要做的是访问'todos'数组中的第二个元素,并将completed属性更新为false - >是真还是真 - >假的。

我有一个带有更新处理程序的按钮,我的更新类方法如下所示:

onUpdate = (id) => {
  const { todos } = this.state;
  let i = todos.findIndex(todo => todo.id === id);
  let status = todos[i].completed
  let updatedTodo = {
    ...todos[i],
    completed: !status
  }
  this.setState({
    todos: [
      ...todos.slice(0, i),
      updatedTodo,
      ...todos.slice(i + 1)
    ]
  });
}

虽然这确实有效,但我想知道是否有更简洁的方法来实现相同的结果;我试图使用Object.assign(),但这没有用,因为我的'todos'是一个数组,而不是一个对象。请用更好的代码来启发我!

2 个答案:

答案 0 :(得分:1)

您只需从todos复制state,然后进行修改,然后将其重新发送回state

onUpdate = (id) => {
    var todos = [...this.state.todos]
    var target = todos.find(todo => todo.id == id)
    if (target) {
        target.completed = !target.completed
        this.setState({ todos })
    }
}

答案 1 :(得分:1)

最好使用update function来确保您不会处理过时的数据:

onUpdate = (id) => {
  this.setState(prevState => {
    const copy = [...prevState.todos];
    const index = copy.findIndex(t => t.id === id);
    copy[index].completed = !copy[index].completed;

    return { todos: copy }
  })  
}