更新状态数组内某些对象的属性

Posted

技术标签:

【中文标题】更新状态数组内某些对象的属性【英文标题】:Update property of certain object inside array in state 【发布时间】:2019-04-28 12:31:32 【问题描述】:

我正在尝试更新我的代码:https://repl.it/@colegonzales1/HeftyJoyfulAbilities

我正在尝试使我的 handleToggle 功能正常工作。为了修修补补,它现在是空白的,但我在过去的 2-3 个小时里试图让它发挥我自己的知识,但我不知道如何访问状态中的特定项目。我知道如何覆盖这一切,但这不是我想做的。说我有:

this.state = 
  todos: [
    
      title: 'Wash car',
      id: 1,
      done: false
    ,
    
      title: 'Go shopping',
      id: 2,
      done: false
    
  ],
  inputValue: ''

我如何才能只将“去购物”待办事项上的 done 值更改为 true?

【问题讨论】:

【参考方案1】:

使用 array.map 仅在与单击的 id 匹配的元素上切换完成标志,如下所示。待办事项的其他属性通过对象扩展复制:

handleToggle (e) 
  const id = parseInt(e.target.id,10)
  this.setState((prevState) => (
    todos: prevState.todos.map(t => t.id === id ? ...t, done: !t.done : t)
  )) 

【讨论】:

你为什么使用 todos: prevState?为什么不直接说 todos: this.state.todos.map? @ColeGonzales prevState 是在状态更改之前访问当前状态的新推荐方式。 teamtreehouse.com/community/…【参考方案2】:

您可以通过findIndex 找到具有给定id 的对象的索引,并创建一个新数组,其中包含该对象的副本,并切换其done 标志。

示例

class App extends React.Component 
  state = 
    todos: [
      
        title: "Wash car",
        id: 1,
        done: false
      ,
      
        title: "Go shopping",
        id: 2,
        done: false
      
    ],
    inputValue: ""
  ;

  handleToggle = id => 
    this.setState(prevState => 
      const todos = [...prevState.todos];
      const todoIndex = todos.findIndex(todo => todo.id === id);

      todos[todoIndex] =  ...todos[todoIndex], done: !todos[todoIndex].done ;

      return  todos ;
    );
  ;

  render() 
    return (
      <div>
        <div>JSON.stringify(this.state)</div>
        <button onClick=() => this.handleToggle(2)>
          Toggle todo with id 2
        </button>
      </div>
    );
  


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>

【讨论】:

以上是关于更新状态数组内某些对象的属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Reactjs 中的状态对象内将值添加到数组中

如何在对象数组中使用 usestate 更新状态?

如何在对象数组中使用 usestate 更新状态?

useEffect 尝试在 React 中更新状态之前读取对象的属性

更新深层不可变状态属性时,Redux 不更新组件

如何创建一个可重用的函数来设置变量对象属性的状态?