2017-10-14 5 views
1
componentWillReceiveProps(nextProps) { 
     if (nextProps.seconds !== 0) { 
      this.setState({ seconds: nextProps.seconds }); 
      setInterval(() => this.getStopTimer(this.state.seconds - 1), 1000); 
     } 
    } 

私はこの反応を反応させてストップウォッチを作りました。反応中のカウントダウンタイマー

したがって、1秒ごとにメソッドgetStopTimerを呼び出し、1つずつ減らしてから{this.state.seconds}を使用してブラウザに表示します。

私はこれに新しいので、私は反応のライフサイクルフックについて単なる考えを持っています。

カウントダウンタイマーは最初の入力で動作していますが、再ロードせずにもう一度開始すると、前回の2倍の時間でタイマーが動作しています。最初の走行と同じように、ストップウォッチは1秒タイマーだったが、次の入力は2秒間同じであった。

これがなぜ起こっているのか説明してください。

getStopTimer(seconds) { 
     console.log(seconds); 
     if (seconds >= 0) { 
      this.setState({ seconds }); 
     } 
    } 

ここにはストップウォッチの子コンポーネントがあります。

import React, { Component } from 'react'; 

class Stopwatch extends Component { 
    constructor(props) { 
     super(props); 
     this.state = { 
      hour: 0, 
      minute: 0, 
      second: 0, 
      seconds: 0 
     }; 
    } 

    componentWillReceiveProps(nextProps) { 
     if (nextProps.seconds !== 0) { 
      this.setState({ seconds: nextProps.seconds }); 
      setInterval(() => this.getStopTimer(this.state.seconds - 1), 1000); 
     } 
    } 

    componentWillUnmount() {} 

    getStopTimer(seconds) { 
     console.log(seconds); 
     if (seconds >= 0) { 
      this.setState({ seconds }); 
     } 
    } 

    render() { 
     return (
      <div> 
       <p>{this.state.seconds} seconds remains!</p> 
      </div> 
     ); 
    } 
} 

export default Stopwatch; 
+0

親子コンポーネントの完全なコードを表示できますか? –

+0

私はストップウォッチコンポーネントを持っており、これを親コンポーネント内で呼びます。

+0

新しい設定を行う前に 'clearInterval()'を実行する必要があります。また、 'componentWillUnmount'ライフサイクルフックでクリアする必要があります。解説しないと、2つの 'setInterval'が並行して実行されるため、毎秒2秒が削除されます。意味がありますか? – Jaxx

答えて

0

設定したタイマーをクリアする必要があります。また、プロンプトを変更するたびにステップごとに余分な秒数を追加して実行し続けます。

import React, { Component } from 'react'; 

class Stopwatch extends Component { 
    constructor(props) { 
     super(props); 
     this.state = { 
      hour: 0, 
      minute: 0, 
      second: 0, 
      seconds: 0, 
      intervalID: undefined 
     }; 
    } 

    componentWillReceiveProps(nextProps) { 
     if (nextProps.seconds !== 0) { 
      if (this.state.intervalID) { 
       clearInterval(this.state.intervalID); 
      } 
      // this.setState({ seconds: nextProps.seconds }); 
      // this.setState({ intervalID: setInterval(() => this.getStopTimer(this.state.seconds - 1), 1000)}); 
      // a better alternative to the 2 lines above 
      this.setState({ 
       seconds: nextProps.seconds, 
       intervalID: setInterval(() => this.getStopTimer(nextProps.seconds - 1), 1000) 
      }); 
     } 
    } 

    componentWillUnmount() { 
     if (this.state.intervalID) { 
      clearInterval(this.state.intervalID); 
     } 
    } 
    ... rest of your code ... 
+0

私はボタンタグを持っています。だから私はどうすればよいでしょうか –

+0

それは私たちが入ることができる別の質問ですが、最初の問題は解決されていますか? – Jaxx

+0

私の初期の問題は実際には解決されていません。タイマーは、私が提出した最初の秒から開始し続けるからです。例。私が最初に10をタイプし、タイマーが完全にworlsを言うとしましょう。しかし、その後、別の時間を15秒と言いたいのなら、タイマーは10秒以上から始まります。 –

関連する問題