Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何更新处于组件状态的对象数组?_Javascript_Arrays_Reactjs_Object - Fatal编程技术网

Javascript 如何更新处于组件状态的对象数组?

Javascript 如何更新处于组件状态的对象数组?,javascript,arrays,reactjs,object,Javascript,Arrays,Reactjs,Object,我试图更新存储在数组中的对象的属性 我的状态是这样的: state = { todos: [ { id: '1', title: 'first item, completed: false }, { id: '2', title: 'second item, completed: false } ], } onUpdate = (id) => { const { todos } = t

我试图更新存储在数组中的对象的属性

我的状态是这样的:

state = {
  todos: [
    {
     id: '1',
     title: 'first item,
     completed: false
    },
    {
     id: '2',
     title: 'second item,
     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)
    ]
  });
}
我试图做的是访问“todos”数组中的第二个元素,并将完成的属性更新为false->true或true->false

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

state = {
  todos: [
    {
     id: '1',
     title: 'first item,
     completed: false
    },
    {
     id: '2',
     title: 'second item,
     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(),但没有成功,因为我的“TODO”是数组,而不是对象。请用更好的代码来启发我

您只需从
状态
复制您的
待办事项
,然后进行编辑,然后将其放回
状态

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

您只需从
状态
复制您的
待办事项
,然后进行编辑,然后将其放回
状态

onUpdate = (id) => {
    var todos = [...this.state.todos]
    var target = todos.find(todo => todo.id == id)
    if (target) {
        target.completed = !target.completed
        this.setState({ todos })
    }
}
最好使用以下方法确保您不会处理过时的数据:

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 }
  })  
}
最好使用以下方法确保您不会处理过时的数据:

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 }
  })  
}

刚试过这个,效果很好!谢谢你。刚刚试过这个,效果很好!非常感谢。