React 中对象数组的 SetState

IT技术 reactjs immutability setstate
2021-05-02 10:16:47

好的,所以我很沮丧找到正确的解决方案,所以我在这里发布问题。给出答案会对我有很大帮助,因为我被卡住了!

状态树看起来像这样

this.state = {
      itemList : [{
                    _id : 1234,
                   description : 'This the description',
                   amount : 100
                    }, {
                    _id : 1234,
                   description : 'This the description',
                   amount : 100
                    }],
     }

问题是:

  1. 无法根据_id更新数组的Object中的任何特定键
  2. 之前的状态应该保持不变
4个回答

2018 年 3 月 25 日回答

这就是您将如何使用 setState 和 prevstate 来更新数据结构中对象的某个属性。

this.setState(prevState => ({
    itemList: prevState.itemList.map(
    obj => (obj._id === 1234 ? Object.assign(obj, { description: "New Description" }) : obj)
  )
}));

2019 年 12 月 12 日回答(react-hooks)

import React, { useState } from 'react';
const App = () => {
  const [data, setData] = useState([
    {
      username: '141451',
      password: 'password',
      favoriteFood: 'pizza',
    },
    {
      username: '15151',
      password: '91jf7jn38f8jn3',
      favoriteFood: 'beans'
    }
  ]);
  return (
    <div>
    {data.map(user => {
      return (
        <div onClick={() => {
          setData([...data].map(object => {
            if(object.username === user.username) {
              return {
                ...object,
                favoriteFood: 'Potatos',
                someNewRandomAttribute: 'X'
              }
            }
            else return object;
          }))
        }}>
        {JSON.stringify(user) + '\n'}
        </div>
      )
    })}
    </div>
  )
}

要更新这样构造的状态,您必须找到要更新的元素的索引,复制数组并更改找到的索引。

如果您将记录列表保留为对象,以 id 作为键,将记录作为值,则更容易且更具可读性。

执行此操作的唯一方法是复制 itemList,修改它,并将状态设置为它。

update() {
   let itemList = this.state.itemList.slice();
   //update it
   this.setState({ itemList });
}

将数据更新为对象数组的最佳方法

onChange={ (e) => this.setState({formData: { ...this.state.formData, 'plan_id': e.target.value}})}