jeerjmin
@jeerjmin

Как изменить свойство объекта встроенного массива через setState?

Добрый день, пытаюсь сделать drag and drop в react с помощью dnd-react
Есть массив в state:
const cards = [
     {id:1 ,name: 'Product A', image: 'pic-001.jpg',  entries: [{entry: 'nature', idEntry: f1fz2},{entry: wisdom, idEntry:52f55}],
     {id:2 ,name: 'Product B', image: 'pic-002.jpg',  entries: [{entry: 'global', idEntry: z2lz1},{entry: eye, idEntry:71d42}],
     {id:3 ,name: 'Product C', image: 'pic-003.jpg',  entries: [{entry: 'local', idEntry: e34z2},{entry: fridge, idEntry:92f12}],
   ]


Таким образом я меняю местами карточки
updateCardPosition(cardId, afterId) {
    if (cardId !== afterId) {
        let cardIndex = this.state.cards.findIndex((card)=>card.id == cardId);
        console.log('gj', cardIndex)
        let card = this.state.cards[cardIndex];
        let afterIndex = this.state.cards.findIndex((card)=>card.id == afterId);
        this.setState(update(this.state, {
            cards: {
                $splice: [
                    [cardIndex, 1],
                    [afterIndex, 0, card]
                ]
            }
        }));
    }
}


Но еще мне нужно менять местами entry в entries, с получением индексов проблем нету( хотя что-то мне подсказывает, что код очень не красив), но как сделать замену в setState?
У меня есть функция
updateEntryPosition(Id, afterId) {
    let cardIndex; // индекс карточки в которой меняют положение записи
    let entryIndex; // текущий индекс записи
    let afterIndex; // будущий индекс записи
    this.state.cards.map(card => card.entries.findIndex((entry) => entry.idEntry == Id)).forEach((item,index) => (item>=0) ? [entryIndex, cardIndex]=[item,index] : 0)
    this.state.cards.map(card => card.entries.findIndex((entry) => entry.idEntry == afterId)).forEach(item => (item>=0) ? afterIndex=item : 0)

}

       this.setState(update(this.state, {
    ????
    }));
}
  • Вопрос задан
  • 340 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы