2017-03-28 3 views
0

は、私は、タイムライン数秒ごとに更新するコンポーネントを書き込もうとしましたので、私はこのようにforループを使用し、間隔がより明白にするためにsetTimeoutを使用します。setTimeoutを使用してsetStateを実行すると、どのように反応コンポーネントを再レンダリングできますか?

let tmp = this.state.colors; 
// colors is an array 
for(let i = 0 ; i < 4; i++){ 
    if(tmp[i]=="blue"){ 
     tmp[i]="green"; 
     setTimeout(function() { 
      console.log(tmp); 
      this.mapped.setState({ 
       colors: tmp 
      }); 
     }.bind({mapped:this}), 2000); 
    } 
} 

しかし、再することができないようです一度に私のコンポーネントをレンダリングすると、2秒ごとにコンポーネントのアップデートがタイムラインに反映されますが、1回だけ再レンダリングします。

eventHandlerが完了した後、すべての反応プロセスがsetStates()であることがわかっています。私は落胆していないことを知っていますが、forceUpdateを使用しようとしましたが、動作しません。

コンポーネントを再レンダリングするにはどうすればよいですか?

ご協力いただければ幸いです。


更新アンドレ・リー@

感謝。

for (let i = 0; i < 4; i++) { 
     setTimeout(function() { 
      tmp[i] = "green"; 
      this.setState({ 
       colors: tmp 
      }); 
     }.bind(this), 2000 * (i + 1)); 
    } 

上記のコードは機能します。

+0

毎回同じ_tmp_を更新していないことをどのように知っていますか? (したがって何もない)。そこに 'console.log(tmp)'を入れてください。 – dandavis

+0

forループは非常に高速ですので、setTimeoutには '2000 * i'を使うべきです。私はちょうど以下の答えを投稿しました。 –

答えて

1

私は http://codepen.io/andretw/pen/JWmYGo

は私のドラフトでは二つの大きな変化があり、次のようにあなたのコードスニペットに基づいて草案を作成しました。

  1. あなたののsetTimeoutため2000 * iを使用する必要があります。または、setIntervalを使用して後でクリアすることもできます。
  2. setTimeoutのコールバック関数のの色を変更してください。
+0

'2000 * 0 = 0; 2000 * 1 = 2000; 2000 * 2 = 4000; 2000 * 3 = 6000; 'なぜ2000 * iをする必要がありますか? – omerowitz

+0

forループでsetTimeoutを実行するので、setTimeout(func、0)、setTimeout(func、2000)、setTimeout(func、4000)、setTimeout(func、6000)はほぼ同じ時間に実行されます。あなたが '* i'をしないと、setTimeout(func、2000)、setTimeout(func、2000)、setTimeout(func、2000)、setTimeout(func、2000)を取得します。彼らはほぼ同じ時間にそれを行います。 –

+0

私のcodepenをforkして '* i'を削除してconsole.log()を見ると、よりよく知ることができます。 –

関連する問題