Reactjs React中对象数组的设置状态

Reactjs React中对象数组的设置状态,reactjs,immutability,setstate,Reactjs,Immutability,Setstate,好的,所以我很沮丧找到正确的解决方案,所以我把问题贴在这里。给我一个答案会帮我很多,因为我被卡住了 状态树如下所示 this.state = { itemList : [{ _id : 1234, description : 'This the description', amount : 100 }, {

好的,所以我很沮丧找到正确的解决方案,所以我把问题贴在这里。给我一个答案会帮我很多,因为我被卡住了

状态树如下所示

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

  • 无法根据更新数组对象中的任何特定键 到\u id
  • 以前的状态应该保持不变

  • 唯一的方法是复制itemList,修改它,并将状态设置为它

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

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

    如果将记录列表作为对象,以id作为键,以记录作为值,则更容易阅读。

    于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}来自“React”;
    常量应用=()=>{
    const[data,setData]=useState([
    {
    用户名:“141451”,
    密码:“password”,
    最喜欢的食物:“披萨”,
    },
    {
    用户名:“15151”,
    密码:“91jf7jn38f8jn3”,
    最喜欢的食物:“豆子”
    }
    ]);
    返回(
    {data.map(用户=>{
    返回(
    {
    setData([…data].map(对象=>{
    if(object.username==user.username){
    返回{
    对象
    最喜欢的食物:“土豆”,
    someNewRandomAttribute:'X'
    }
    }
    否则返回对象;
    }))
    }}>
    {JSON.stringify(用户)+'\n'}
    )
    })}
    )
    }
    
    将数据更新到对象数组中的最佳方法


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

    let itemList=this.state.itemList。如果在此之后修改
    itemList
    ,则是在改变状态。切分时不是这样。@DragoşPaulMarinescu你错了,切分创建了一个副本。因为文章经过编辑,很明显我的评论引用了初始代码。@DragoşPaulMarinescu没有看到编辑,刚才有没有想过如何迭代所有对象?如果你在应用程序中使用lodash或ramda,你可以使用它,也可以使用Object.keys()。我通常使用redux来保存这样的数据,并使用reselect,所以我的选择器返回arrays@Omar我需要更新数组中的整个对象??然后只需执行const updatedValues=array.map(item=>{return{…item,updatedKey:'value'}})
    Object.assign(obj
    变异当前状态对象,该对象是React中的反模式。
    对象。赋值({},obj
    将正确创建新对象。
    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>
      )
    }