ES6版React.jsでCowntdown Timerを作ってみる
See the Pen countdown timer by uraway (@uraway) on CodePen.
参考:
reactjs - React.jsでFormを扱う - Qiita
Forms | React
タイトル通り。
class CountdownTimer extends React.Component { constructor() { super(); this.tick = this.tick.bind(this); this.state = { secondsRemaining: "initial value", isStart: false, } } setSeconds (e) { this.setState({secondsRemaining: e.target.value}); } tick() { this.setState({ secondsRemaining: this.state.secondsRemaining -1 }); if (this.state.secondsRemaining <= 0) { clearInterval(this.interval); document.getElementById('span').innerHTML='Seconds Remaining: FINISHED'; } } start() { if(!this.state.isStart ){ this.interval = setInterval(this.tick, 1000); this.setState({ isStart: true }); } } stop() { if(this.state.isStart){ clearInterval(this.interval); this.setState({ isStart: false }); } } reset() { clearInterval(this.interval); this.setState({ secondsRemaining:'initial value', isStart: false, }); } componentWillUnmount() { clearInterval(this.interval); } render() { return ( <div><span id="span">Seconds Remaining: <input type="number" value={this.state.secondsRemaining} onChange={this.setSeconds.bind(this)} /></span> <div> <button onClick={this.start.bind(this)}>start</button> <button onClick={this.stop.bind(this)}>stop</button> <button onClick={this.reset.bind(this)}>reset</button> </div> </div> ); } } React.render(<CountdownTimer />, document.body);
type="number"なので、入力値は数字のみ受付される。負の数も入力自体は可能。その場合はtick関数内のif文によって、FINISHEDが表示される。HTMLの上書きなので、reset関数は動作しない。ページリロードしなければならない。
入力に関しては、valueをStateで管理しつつ、onChangeで明示的にsetStateして更新。まだちょっとイベントは難しく感じる