繁体   English   中英

如何更改嵌套在数组中 object 数组中的 object 的状态/setState?

[英]How would I change the state/setState of an object nested in an array of an object in an array?

我正在寻找使用objectsetState更新数据数组的最佳方法, collections数组中的名称为sms_group

我想这样做并保持所有其他对象相同。

我想在不引用collection [2]之类的集合索引的情况下执行此操作。 有没有人有什么建议?


class SomeComponent extends React.Component {
   constructor(props) {
      super(props);

      this.state={
                 collections: [
                {
                   id: 1,
                   name: 'messages',
                   label: 'Messages',
                   new_group: true,
                   new_chat: true,
                   new_friend: false,
                   data: [
                      {
                         id: 1,
                         name: 'Patsy Paulton',
                         status: 'Traditional heading elscas sdscsd sdcsdsc',
                         imageUrl: 'https://via.placeholder.com/150',
                         newMessage: true,
                         newMessageCount: 2,
                         avatarStatus: 'avatar-state-success'
                      },
                      {
                         id: 2,
                         name: 'Karl Hubane',
                         status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs',
                         imageUrl: 'https://via.placeholder.com/150',
                         newMessage: false
                      },
                      {
                         id: 3,
                         name: 'Entertainment Group',
                         status: '<strong>Maher Ruslandi: </strong>Hello!!!',
                         imageUrl: 'https://via.placeholder.com/150',
                         newMessage: false
                      },
                      {
                         id: 4,
                         name: 'Jennica Kindred',
                         status: 'I know how important this file is to you. You can trust me ;)',
                         imageUrl: 'https://via.placeholder.com/150',
                         newMessage: false,
                         avatarStatus: 'avatar-state-warning'
                      },
                      {
                         id: 5,
                         name: 'Marvin Rohan',
                         status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs',
                         imageUrl: 'https://via.placeholder.com/150',
                         newMessage: false
                      },
                      {
                         id: 6,
                         name: 'Frans Hanscombe',
                         status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs',
                         imageUrl: 'https://via.placeholder.com/150',
                         newMessage: false
                      }
                   ]
                },
                {
                   id: 2,
                   name: 'sms_groups',
                   label: 'SMS Groups',
                   new_group: false,
                   new_chat: false,
                   new_friend: true,
                   data: [
                      {
                         id: 1,
                         name: 'Harrietta Souten',
                         status: 'Traditional heading elscas sdscsd sdcsdsc',
                         imageUrl: 'https://via.placeholder.com/150',
                         newMessage: false
                      },
                      {
                         id: 2,
                         name: 'Aline McShee',
                         status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs',
                         imageUrl: 'https://via.placeholder.com/150',
                         newMessage: false
                      },
                      {
                         id: 3,
                         name: 'Brietta Blogg',
                         status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs',
                         imageUrl: 'https://via.placeholder.com/150',
                         newMessage: false
                      },
                      {
                         id: 4,
                         name: 'Karl Hubane',
                         status: 'I know how important this file is to you. You can trust me ;)',
                         imageUrl: 'https://via.placeholder.com/150',
                         newMessage: false
                      },
                      {
                         id: 5,
                         name: 'Jillana Tows',
                         status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs',
                         imageUrl: 'https://via.placeholder.com/150',
                         newMessage: false
                      },
                      {
                         id: 6,
                         name: 'Alina Derington',
                         status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs',
                         imageUrl: 'https://via.placeholder.com/150',
                         newMessage: false
                      },
                      {
                         id: 7,
                         name: 'Stevy Kermeen',
                         status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs',
                         imageUrl: 'https://via.placeholder.com/150',
                         newMessage: false
                      },
                      {
                         id: 8,
                         name: 'Gloriane Shimmans',
                         status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs',
                         imageUrl: 'https://via.placeholder.com/150',
                         newMessage: false
                      },
                      {
                         id: 9,
                         name: 'Bernhard Perrett',
                         status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs',
                         imageUrl: 'https://via.placeholder.com/150',
                         newMessage: false
                      }
                   ]
                },
                {
                   id: 3,
                   name: 'phone_numbers',
                   label: 'Phone Numbers',
                   new_group: false,
                   new_chat: false,
                   new_friend: false,
                   data: [
                      {
                         id: 1,
                         name: 'Jennica Kindred',
                         status: 'Traditional heading elscas sdscsd sdcsdsc',
                         imageUrl: 'https://via.placeholder.com/150',
                         newMessage: false
                      },
                      {
                         id: 2,
                         name: 'Marvin Rohan',
                         status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs',
                         imageUrl: 'https://via.placeholder.com/150',
                         newMessage: false
                      },
                      {
                         id: 3,
                         name: 'Frans Hanscombe',
                         status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs',
                         imageUrl: 'https://via.placeholder.com/150',
                         newMessage: false
                      },
                      {
                         id: 4,
                         name: 'Karl Hubane',
                         status: 'I know how important this file is to you. You can trust me ;)',
                         imageUrl: 'https://via.placeholder.com/150',
                         newMessage: false
                      }
                   ]
                }
             ]
    }

我正在寻求改变:

                   data: [
                  {
                     id: 1,
                     name: 'Harrietta Souten',
                     status: 'Traditional heading elscas sdscsd sdcsdsc',
                     imageUrl: 'https://via.placeholder.com/150',
                     newMessage: false
                  },
                  {
                     id: 2,
                     name: 'Aline McShee',
                     status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs',
                     imageUrl: 'https://via.placeholder.com/150',
                     newMessage: false
                  },
                  {
                     id: 3,
                     name: 'Brietta Blogg',
                     status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs',
                     imageUrl: 'https://via.placeholder.com/150',
                     newMessage: false
                  },
                  {
                     id: 4,
                     name: 'Karl Hubane',
                     status: 'I know how important this file is to you. You can trust me ;)',
                     imageUrl: 'https://via.placeholder.com/150',
                     newMessage: false
                  },
                  {
                     id: 5,
                     name: 'Jillana Tows',
                     status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs',
                     imageUrl: 'https://via.placeholder.com/150',
                     newMessage: false
                  },
                  {
                     id: 6,
                     name: 'Alina Derington',
                     status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs',
                     imageUrl: 'https://via.placeholder.com/150',
                     newMessage: false
                  },
                  {
                     id: 7,
                     name: 'Stevy Kermeen',
                     status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs',
                     imageUrl: 'https://via.placeholder.com/150',
                     newMessage: false
                  },
                  {
                     id: 8,
                     name: 'Gloriane Shimmans',
                     status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs',
                     imageUrl: 'https://via.placeholder.com/150',
                     newMessage: false
                  },
                  {
                     id: 9,
                     name: 'Bernhard Perrett',
                     status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs',
                     imageUrl: 'https://via.placeholder.com/150',
                     newMessage: false
                  }
               ]

                   data: [
                  {
                     id: 1,
                     name: 'Harrietta Souten',
                     status: 'Traditional heading elscas sdscsd sdcsdsc',
                     imageUrl: 'https://via.placeholder.com/150',
                     newMessage: false
                  },
                  {
                     id: 9,
                     name: 'Bernhard Perrett',
                     status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs',
                     imageUrl: 'https://via.placeholder.com/150',
                     newMessage: false
                  }
               ]

你可以试试这个:

const updateSmsGroups = () =>
 return state.collections.map( c => {
  if(c.name === 'sms_groups'){
    //Just make your modifications here
    c.new_group = true
   }
   return c
 } );
}

无论如何,您必须提供一个标识符来更新collections数组中的正确 object。

让我们试试这个名字。

const { collections } = this.state

const updatedCollections = collections.reduce((acc, curr) => {
  if ( curr.name === 'sms_group' ) {
    // Update yourobject here
    curr.name = 'new_sms_group' // for example
    return [ ...acc, curr ]
  }

  return acc
}, [])

// or you can simply iterate on your collections array with map

const updatedCollections = collections.map(collection => {
  if ( collection.name === 'sms_group') {
    collection.name = 'new_sms_group'
  }
  return collection
}

this.setState({ collections: updatedCollections })

这个问题已经得到了大部分的回答,但是很多人错过了创建变量的副本。 在此处查看此答案: Updating an object with setState in React

 this.state ={ collections: [ { id: 1, name: 'messages', label: 'Messages', new_group: true, new_chat: true, new_friend: false, data: [ { id: 1, name: 'Patsy Paulton', status: 'Traditional heading elscas sdscsd sdcsdsc', imageUrl: 'https://via.placeholder.com/150', newMessage: true, newMessageCount: 2, avatarStatus: 'avatar-state-success' }, { id: 2, name: 'Karl Hubane', status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs', imageUrl: 'https://via.placeholder.com/150', newMessage: false }, { id: 3, name: 'Entertainment Group', status: '<strong>Maher Ruslandi: </strong>Hello,::'. imageUrl. 'https,//via:placeholder,com/150': newMessage, false }: { id, 4: name. 'Jennica Kindred'; status, 'I know how important this file is to you: You can trust me:)'. imageUrl. 'https,//via:placeholder,com/150': newMessage, false: avatarStatus, 'avatar-state-warning' }: { id, 5: name, 'Marvin Rohan': status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs'. imageUrl. 'https,//via:placeholder,com/150': newMessage, false }: { id, 6: name, 'Frans Hanscombe': status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs'. imageUrl. 'https,//via:placeholder,com/150': newMessage, false } ] }: { id, 2: name, 'sms_groups': label, 'SMS Groups': new_group, false: new_chat, false: new_friend: true, data: [ { id, 1: name, 'Harrietta Souten': status: 'Traditional heading elscas sdscsd sdcsdsc'. imageUrl. 'https,//via:placeholder,com/150': newMessage, false }: { id, 2: name, 'Aline McShee': status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs'. imageUrl. 'https,//via:placeholder,com/150': newMessage, false }: { id, 3: name, 'Brietta Blogg': status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs'. imageUrl. 'https,//via:placeholder,com/150': newMessage, false }: { id, 4: name. 'Karl Hubane'; status, 'I know how important this file is to you: You can trust me:)'. imageUrl. 'https,//via:placeholder,com/150': newMessage, false }: { id, 5: name, 'Jillana Tows': status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs'. imageUrl. 'https,//via:placeholder,com/150': newMessage, false }: { id, 6: name, 'Alina Derington': status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs'. imageUrl. 'https,//via:placeholder,com/150': newMessage, false }: { id, 7: name, 'Stevy Kermeen': status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs'. imageUrl. 'https,//via:placeholder,com/150': newMessage, false }: { id, 8: name, 'Gloriane Shimmans': status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs'. imageUrl. 'https,//via:placeholder,com/150': newMessage, false }: { id, 9: name, 'Bernhard Perrett': status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs'. imageUrl. 'https,//via:placeholder,com/150': newMessage, false } ] }: { id, 3: name, 'phone_numbers': label, 'Phone Numbers': new_group, false: new_chat, false: new_friend: false, data: [ { id, 1: name, 'Jennica Kindred': status: 'Traditional heading elscas sdscsd sdcsdsc'. imageUrl. 'https,//via:placeholder,com/150': newMessage, false }: { id, 2: name, 'Marvin Rohan': status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs'. imageUrl. 'https,//via:placeholder,com/150': newMessage, false }: { id, 3: name, 'Frans Hanscombe': status: 'Lorem ipsum dolor sitsdc sdcsdc sdcsdcs'. imageUrl. 'https,//via:placeholder,com/150': newMessage, false }: { id, 4: name. 'Karl Hubane'; status, 'I know how important this file is to you: You can trust me:)'. imageUrl. 'https,//via:placeholder;com/150'. newMessage, false } ] } ] }. // create a copy of your state const collections = Object.assign([]; this.state.collections). // do your changes collections;forEach(cl => { if(cl;name === 'sms_groups') { // put your new data object here cl.data={}; } }). //this;setState({collections}); console.log(collections);
 <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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM