在setstate之前复制并更新嵌套对象。反应母语

时间:2018-04-25 20:14:49

标签: javascript reactjs react-native

我的州有嵌套对象:

constructor(props) {
    super(props);
    this.state = {
        aba1Array: [
            {
                item:[
                       {
                         id: 1,
                         nome: "apple",
                         selected:false,
                       },
                       {
                         id: 2,
                         nome: "juice",
                         selected:false,
                       }
                     ]
             },
             {
                item:[
                       {
                        id: 3,
                        nome: "apple",
                        selected:false,
                       },
                       {
                        id: 4,
                        nome: "juice",
                        selected:false,
                       }
                     ]
              }
              ],
             };
}

现在我想制作一个数组的副本,更新一个项目,再次设置setState(这是更新的正确方法,对吗?),该怎么做?这是我目前的代码:

updateItem(id){
    let newItems = Object.keys(this.state.aba1Array).map((subitem) => {
    subitem.item.map((item) => item.id===id ? {...item, selected: true } : item);
    });
    this.setState({ aba1Array: newItems });
}

这是回归: TypeError:undefined不是对象(评估'subitem.item.map')

编辑:当我添加第二级嵌套时,问题就开始了,在它只有一个级别正常工作之前,就像这样:

let newItems = Object.keys(this.state.aba1Array).map((item) => {
         item.id===id ? {...item, selected: true } : item);

edited2:在屏幕的另一部分,我只列出了项目,我正在使用:

listItem() { return this.state.aba1Array.map((subitem)=> { return ( subitem.item.map((item) => { return ( <View> ......

它工作正常。为什么在更新功能中它给我错误?我不明白

编辑3: - 解决方案 -

我的解决方案是使用库object-path-immutable:

updateItem(itemIndex,subIndex){
        const newObj = immutable.update(this.state.aba1Array, [subIndex,'item', itemIndex , 'selected' ], v => true );
        this.setState({ aba1Array: newObj });
    }

2 个答案:

答案 0 :(得分:0)

我的解决方案是使用库object-path-immutable:

updateItem(itemIndex,subIndex){
        const newObj = immutable.update(this.state.aba1Array, [subIndex,'item', itemIndex , 'selected' ], v => true );
        this.setState({ aba1Array: newObj });
    }

答案 1 :(得分:0)

最佳解决方案: 我忘了在map函数上返回值,所以新数组没有得到对象的完整树,最好的解决方案是:

 let newItems = this.state.aba1Array.map((subitem) => {
            subitem.item.map((item) => {
                item.selected = true;
                return item;
            })
            return subitem;
    });