2017-12-22 17 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 edit:better link – 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

関連する問題