Reactjs Обновить отдельный элемент в массиве внутри состояния

У меня есть компонент:

constructor(props) {
    super(props);

    this.state = {
        cards: []
    };
}

Внутри массива this.state.cards для каждой карты структура данных выглядит так:

{
  movie: v,
  ids: v.id,
  goodDeal: `Cheapest price is ... at ...`
}

Теперь мне нужно объединить другой массив карт (скажем, card2) с моим текущим массивом state.cards:

componentDidMount(){
    cards2.map((v, i)=>{
       var existedCard = this.state.cards.find((cv, ci)=>{
           if (cv.code === v.code){
               return cv;
           }
       })

       if (existedCard){
          existedCard.ids += v.id;

          this.setState((prevState, pros)=> {
              // then update the state, but how?                   
          })
       }
       else {
          // add the new card into the current cards array
       }
    })
}

Как видите, если я нашел карту (newCard) в card2, которая также находится в card1 (это state.cards), я добавляю newCard.id в existedCard.ids. Затем я хочу вызвать setState (), чтобы обновить состояние.

Но как?

используйте setState и передайте функцию. Вы можете объявить изменения состояния отдельно от классов компонентов. В основном возьмите ваше слияние карточек, создайте из него функцию и передайте ее в setState ({}) Вот твит Дэна по этому поводу. twitter.com/dan_abramov/status/824308413559668744/photo/…

iceveda06 18.04.2018 17:09

@ iceveda06, спасибо :) твит, которым вы поделились, очень помог (не для этого вопроса, а для другого вопроса) :)

Franva 19.04.2018 03:36
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
2
633
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте форму setState((prevState) => {/* method that returns nextState*/}).
Чтобы добавить новый объект, запустите

this.setState(prevState => ({
  cards: prevState.cards.concat(existedCard)
}))

Для обновления вам нужно сначала отфильтровать старый объект

this.setState(prevState => ({
  cards: prevState.cards.filter( card => card.id !== v.id).concat(existedCard)
}))

Вы также можете использовать оператор распространения, если он поддерживается вашей целевой (сборочной) системой.

this.setState(prevState => ({
  cards: [...prevState.cards, existedCard]
}))

Привет, Моти, спасибо за ответ. Я пробовал оператор распространения, он добавляет обновленную карту в массив карт, но он также добавляет все другие карты, которые уже существуют, в массив state.cards. Нашел другой способ, выложу здесь.

Franva 19.04.2018 03:28
Ответ принят как подходящий

Object.assign () - это решение для меня.

            this.setState((prevState, props) => {
                return Object.assign({}, prevState, existedCard);
            });

Другие вопросы по теме