2017-12-22 22 views
1

아래 함수에서 반응 구성 요소의 상태를 업데이트하려고합니다. animalMix 아이템은 배열입니다. 사본을 가져 와서 업데이트 한 다음 원본을 덮어 씁니다. 새 배열 (newAnimalsHeld)이 올바르게 업데이트되었는지 확인했지만 상태가 같으면 animalMix를 설정할 때 반영되지 않습니다. 어떤 도움 https://codepen.io/timsig/pen/XVdbdo?editors=0010반응 구성 요소 상태의 배열 업데이트

많은 감사 :

모든 것은

여기 맥락에서 볼 수있다.

removePair(){ 
    console.log('Match!'); 
    console.log(this.flipped); 

    let animalsHeld = [...this.state.animalMix]; 
    let theMatch = this.flipped[0].props.animal; 

    let newAnimalsHeld = animalsHeld.map(function(animal){ 
    if (animal.animal === theMatch) { 
     console.log('MATCH! Animal: ' + animal.animal + 'Match:' + theMatch); 
     return {}; 
    }else{ 
     return animal; 
    } 
    }); 

    console.log('New Animals held: ', newAnimalsHeld); 
    this.setState({ 
    animalMix: newAnimalsHeld, 
    doTurn: true 
    }); 

    this.flipped = []; 
    console.log(this.state.doTurn, this.state.animalMix); 
} 
+0

setState를 비동기, 그래서 당신이 CONSOLE.LOG 문에 도착하면이 업데이트 한되지 않을 수 있습니다 https://github.com/ vasanthk/react-bits/blob/master/patterns/19.async-nature-of-setState.md 편집 : 더 좋은 링크 – brub

+0

그리고'map' 대신에'filter'를 써야만합니다. 빈 객체를 반환하는 대신 일치하지 않습니다. –

+0

@Timbo 일치하는 동물은 어떻게됩니까? 그들이 사라지거나 제거해야합니까? 아니면 그냥 뒤집어 놓아야합니까? – Tuna

답변

0

setState는 비동기 함수입니다. 그러나 상태는 다음과 같은 방식으로 업데이트 한 후 콘솔에 인쇄 할 수 있습니다

this.setState({ 
    animalMix: newAnimalsHeld, 
    doTurn: true 
},() => {console.log(this.state.doTurn, this.state.animalMix);}); 
+0

많은 감사합니다 - 그것을 정리, – Timbo