Скопируйте и обновите вложенный объект до установки.реагировать родной - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть вложенные объекты в моем состоянии:

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 голосов
/ 27 апреля 2018

Лучшее решение: я забыл вернуть значение функции карты, поэтому новый массив не получил полное дерево объекта, лучшее решение:

 let newItems = this.state.aba1Array.map((subitem) => {
            subitem.item.map((item) => {
                item.selected = true;
                return item;
            })
            return subitem;
    });
0 голосов
/ 26 апреля 2018

Моим решением было использовать библиотеку object-path-immutable:

updateItem(itemIndex,subIndex){
        const newObj = immutable.update(this.state.aba1Array, [subIndex,'item', itemIndex , 'selected' ], v => true );
        this.setState({ aba1Array: newObj });
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...