У меня есть компонент:
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 (), чтобы обновить состояние.
Но как?
@ iceveda06, спасибо :) твит, которым вы поделились, очень помог (не для этого вопроса, а для другого вопроса) :)





Используйте форму 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. Нашел другой способ, выложу здесь.
Object.assign () - это решение для меня.
this.setState((prevState, props) => {
return Object.assign({}, prevState, existedCard);
});
используйте setState и передайте функцию. Вы можете объявить изменения состояния отдельно от классов компонентов. В основном возьмите ваше слияние карточек, создайте из него функцию и передайте ее в setState ({}) Вот твит Дэна по этому поводу. twitter.com/dan_abramov/status/824308413559668744/photo/…