2016-09-10 6 views
24
私が反応し、ちょうど画面に Date.now()をレンダリングし、次の時間コンポーネント持ちで遊んでてきた

アップデートコンポーネント毎秒反応

import React, { Component } from 'react'; 

class TimeComponent extends Component { 
    constructor(props){ 
    super(props); 

    this.state = { time: Date.now() }; 
    } 
    render(){ 
    return(
     <div> { this.state.time } </div> 
    ); 
    } 
    componentDidMount() { 
    console.log("TimeComponent Mounted...") 
    } 
} 

export default TimeComponent; 

は毎秒を更新するには、このコンポーネントを取得するための最良の方法だろう何をReactの視点から時間を再描画するには?

答えて

41

これはReact.jsのウェブサイトからの例です:

var Timer = React.createClass({ 
    getInitialState: function() { 
    return {secondsElapsed: 0}; 
    }, 
    tick: function() { 
    this.setState({secondsElapsed: this.state.secondsElapsed + 1}); 
    }, 
    componentDidMount: function() { 
    this.interval = setInterval(this.tick, 1000); 
    }, 
    componentWillUnmount: function() { 
    clearInterval(this.interval); 
    }, 
    render: function() { 
    return (
     <div>Seconds Elapsed: {this.state.secondsElapsed}</div> 
    ); 
    } 
}); 

ReactDOM.render(<Timer />, mountNode); 
+0

私はthis.updater.enqueueSetStateがfunctioではありません取得何らかの理由このアプローチを使用するとnエラーが発生します。 setIntervalコールバックはコンポーネントthisに正しくバインドされています。 – baldrs

+4

私のような馬鹿の場合:更新周期が崩れるので 'updater'という名前を付けないでください – baldrs

+2

ES6ではthis.interval = setInterval(this.tick.bind(this)、1000)のように1行を変更する必要があります。 – Kapil

3

コンポーネントのcomponentDidMountライフサイクルメソッドでは、状態を更新する関数を呼び出す間隔を設定できます。

componentDidMount() { 
     setInterval(() => this.setState({ time: Date.now()}), 1000) 
} 
9

変更をトリガーするsetTimeoutを使用する必要がありますが、部品のアンマウントは残し、それを防ぐためにするときにもタイマをクリアする必要がありますエラーやメモリリーク:

componentDidMount() { 
    this.interval = setInterval(() => this.setState({ time: Date.now() }), 1000); 
} 
componentWillUnmount() { 
    clearInterval(this.interval); 
} 
+0

私はこれが正解であるべきだと思います。ありがとう。 –

-1
class ShowDateTime extends React.Component { 
    constructor() { 
     super(); 
     this.state = { 
     curTime : null 
     } 
    } 
    componentDidMount() { 
     setInterval(() => { 
     this.setState({ 
      curTime : new Date().toLocaleString() 
     }) 
     },1000) 
    } 
    render() { 
     return(
      <div> 
      <h2>{this.state.curTime}</h2> 
      </div> 
     ); 
     } 
    } 
関連する問題