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

我有這段代碼在reactjs中製作秒錶。倒計時計時器

因此,在每一秒鐘它調用一個方法getStopTimer並減少第二個,然後使用{this.state.seconds}在瀏覽器中顯示。

我對生命週期鉤子只有一個簡單的想法,因爲我對此很陌生。

倒計時器正在對我的第一個輸入進行處理,但是當我再次給它開始時沒有重新加載時,定時器運行的時間是前一次的兩倍。就像第一次運行一樣,秒錶用於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秒,計時器完美無缺。但之後,如果我想開始另一個時間說15秒,計時器又從10秒開始再次 –