2017-09-26 21 views
0

1つの入力と3つのボタンがある反応からタイマーモジュールを作成しました。(タイマーを開始します)2-Pause(タイマーを一時停止します)タイマーを停止する)問題は、私が何らかの値を入力してタイマーを開始し、 "Stop"ボタンを押すと値が0になるが、もう一度ヒットするときである。 "Start"ボタンは、私はStopボタンの時にクリックしたのではなく、以前に入力フィールドに書かれた値から始めるべきです。私が何を言っているのか分からない場合は、それをチェックしてください。スタートストップボタンが反応して反応しない

コード:

<!Doctype html> 
 
<html> 
 
    <head> 
 
     <title>React 1</title> 
 
     <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.2/react.js"></script> 
 
\t \t <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.2/react-dom.js"></script> 
 
     <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/JSXTransformer.js"></script> 
 
     <script src="https://unpkg.com/react-form-with-constraints/dist/react-form-with-constraints.js"></script> 
 
    </head> 
 
    <body> 
 
     <script type="text/jsx"> 
 
      var styles = { 
 
       margin: '2em auto', 
 
       width: '300px', 
 
       height: '300px', 
 
       backgroundColor: '#DD4814', 
 
       color: '#ffffff', 
 
       display: 'flex', 
 
       flexDirection: 'column', 
 
       alignItems: 'center', 
 
       justifyContent: 'space-around' 
 
      }; 
 
      var inputs = { 
 
       position: 'relative', 
 
       bottom: '17%', 
 
       left: '20%' 
 
      } 
 
      var btns = { 
 
       position: 'relative', 
 
       bottom: '7%' 
 
      } 
 
      var btn = { 
 
       backgroundColor: '#ffffff', 
 
       color: '#000000', 
 
       borderColor: '#DEB887', 
 
       borderRadius: '0.4em', 
 
       cursor: 'pointer', 
 
       margin: '0 1em', 
 
       padding: '0.5em', 
 
       display: 'inline-block' 
 
      } 
 
      class Timer extends React.Component { 
 
       constructor (props) { 
 
        super(props) 
 
        this.state = 
 
         { 
 
          count: 0, 
 
          customNumber: 0 
 
         } 
 
       } 
 
\t \t \t \t handleChange (e) { 
 
        this.setState({ \t customNumber: e.target.value}); 
 
       } 
 
       componentWillUnmount() { 
 
        clearInterval(this.timer) 
 
       } 
 
       tick() { 
 
        if (this.state.customNumber) { 
 
\t \t \t \t \t \t this.setState({ 
 
\t \t \t \t \t \t \t count: (this.state.customNumber--) 
 
\t \t \t \t \t \t }) 
 
\t \t \t \t \t \t if (this.state.customNumber <= 0) { 
 
\t \t \t \t \t \t \t this.setState({ \t count: 0}) 
 
\t \t \t \t \t \t \t clearInterval(this.timer) 
 
\t \t \t \t \t \t \t this.setState({ disabled: false }) 
 
\t \t \t \t \t \t } 
 
        } else { 
 
         this.setState({count: (this.state.count - 1)}) 
 
        } 
 
       } 
 
\t \t \t \t 
 
\t \t \t \t display() { 
 
        return ('0' + this.state.count % 100).slice(-2) 
 
       } 
 
\t \t \t \t 
 
       startTimer() { 
 
        if (this.state.customNumber == "" || isNaN(this.state.customNumber)) 
 
        { 
 
         alert("Please give some value in number"); 
 
        } else { 
 
         clearInterval(this.timer) 
 
         this.timer = setInterval(this.tick.bind(this), 1000) 
 
         this.setState({ disabled: true }) 
 
        } 
 
       } 
 
       stopTimer() { 
 
        clearInterval(this.timer) 
 
       } 
 
       resetTimer() { 
 
        clearInterval(this.timer) 
 
        this.setState({count: 0}) 
 
        this.setState({ disabled: false }) 
 
       } 
 
       render() { 
 
        return (
 
        <div style={styles} className='timer'> 
 
         <h1 style={{fontSize: '4em'}}>{this.display()}</h1> 
 
\t \t \t \t \t \t <div className="input_text" style={inputs}> 
 
\t \t \t \t \t \t \t <label htmlFor="custom_number">Enter number to start timer</label> 
 
\t \t \t \t \t \t \t <input type="text" name="custom_number" id="custom_number" value={this.state.inputValue} onChange={this.handleChange.bind(this)} disabled={this.state.disabled} placeholder="Enter b/w 1-100" /> 
 
\t \t \t \t \t \t </div> 
 
         <div style={btns} className="buttons"> 
 
\t \t \t \t \t \t \t <button style={btn} type="button" name="start_btn" id="start_btn" onClick={this.startTimer.bind(this)}>Start</button> 
 
\t \t \t \t \t \t \t <button style={btn} type="button" name="stop_btn" id="stop_btn" onClick={this.stopTimer.bind(this)}>Pause</button> 
 
\t \t \t \t \t \t \t <button style={btn} type="button" name="reset_btn" id="reset_btn" onClick={this.resetTimer.bind(this)}>Stop</button> 
 
         </div> 
 
        </div> 
 
        ) 
 
       } 
 
      } 
 
      ReactDOM.render(<Timer />, document.getElementById('root')) 
 
     </script> 
 
     <div id="root"></div> 
 
    </body>  
 
</html>

+0

私は 'のonChange = {this.handleChange.bind(本)}'定義を見ることができません。これは問題かもしれません。あなたの状態 - > customCountは入力から値を持っていません。 – Umesh

+0

私はそれを定義しました –

答えて

0

すべてのあなたのコードは、ほぼ大丈夫ですが、あなたはそれはあなたが期待通りに正しく動作させるためにいくつかの変更を加える必要があります。

最初に、カウントダウンの最後の入力(数値)を保存する必要があります。コンポーネントの状態にlastInput: 0を追加して、タイプが入力フィールドに入力されたときにその状態が入力されるようにします。 lastInputプロパティは、設定した値で変更されます。 [停止]ボタンをクリックすると

、あなたがこれだけやっていた:this.setState({ count: 0 })をしかし、あなたが何かを忘れてた、あなたはこれを実行する必要があるので、それをリセットするにはあまりにもプロパティcustomNumberを再起動する必要があります。this.setState({ count: 0, customNumber: this.state.lastInput })this.state.lastInputが持っていますユーザーが設定した最後の値です。つまり、入力値をローカル変数に保存しないようにするため、その値をコンポーネントの状態に保存する方が良いと思います。

NOTE

あなたのリアクトコンポーネントでバベルを使用している場合は、この方法でそれを行うことができますので、あなたがthis.myfunction.bind(this)構文を避けることができますので、それは、ES6から矢印の機能を使用して良くなります。

例として、あなたのコードを取って

それはこのようになります:

handleChange = (e) => { 
    var value = e.target.value; 
    this.setState({ customNumber: value, lastInput: value }); 
} 

は今、あなたがバインドすることなく、上記の機能を使用することができます

<input className="some-classname" onChange={this.handleChange} /> 

何が起こったのですか?そのため、ES6の矢印機能はあなたのためにバインド処理を行います。つまり、魔法のように自動で実行されます。

はあなたが古いブラウザにそれらを理解しやすくするためにES5にごES6コードをtranspileするバベルを使用している場合にのみ、上記のコードを実行でき

を覚えています。

<!Doctype html> 
 
<html> 
 
    <head> 
 
     <title>React 1</title> 
 
     <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.2/react.js"></script> 
 
\t \t <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.2/react-dom.js"></script> 
 
     <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/JSXTransformer.js"></script> 
 
     <script src="https://unpkg.com/react-form-with-constraints/dist/react-form-with-constraints.js"></script> 
 
    </head> 
 
    <body> 
 
     <script type="text/jsx"> 
 
      var styles = { 
 
       margin: '2em auto', 
 
       width: '300px', 
 
       height: '300px', 
 
       backgroundColor: '#DD4814', 
 
       color: '#ffffff', 
 
       display: 'flex', 
 
       flexDirection: 'column', 
 
       alignItems: 'center', 
 
       justifyContent: 'space-around' 
 
      }; 
 
      var inputs = { 
 
       position: 'relative', 
 
       bottom: '17%', 
 
       left: '20%' 
 
      } 
 
      var btns = { 
 
       position: 'relative', 
 
       bottom: '7%' 
 
      } 
 
      var btn = { 
 
       backgroundColor: '#ffffff', 
 
       color: '#000000', 
 
       borderColor: '#DEB887', 
 
       borderRadius: '0.4em', 
 
       cursor: 'pointer', 
 
       margin: '0 1em', 
 
       padding: '0.5em', 
 
       display: 'inline-block' 
 
      } 
 
      class Timer extends React.Component { 
 
       constructor (props) { 
 
        super(props) 
 
        this.state = 
 
         { 
 
          count: 0, 
 
          customNumber: 0, 
 
          lastInput: 0 
 
         } 
 
       } 
 
\t \t \t \t handleChange (e) { 
 
        const value = e.target.value; 
 
        this.setState({ \t customNumber: value, lastInput: value}); 
 
       } 
 
       componentWillUnmount() { 
 
        clearInterval(this.timer) 
 
       } 
 
       tick() { 
 
        if (this.state.customNumber) { 
 
\t \t \t \t \t \t this.setState({ 
 
\t \t \t \t \t \t \t count: (this.state.customNumber--) 
 
\t \t \t \t \t \t }) 
 
\t \t \t \t \t \t if (this.state.customNumber <= 0) { 
 
\t \t \t \t \t \t \t this.setState({ \t count: 0}) 
 
\t \t \t \t \t \t \t clearInterval(this.timer) 
 
\t \t \t \t \t \t \t this.setState({ disabled: false }) 
 
\t \t \t \t \t \t } 
 
        } else { 
 
         this.setState({count: (this.state.count - 1)}) 
 
        } 
 
       } 
 
\t \t \t \t 
 
\t \t \t \t display() { 
 
        return ('0' + this.state.count % 100).slice(-2) 
 
       } 
 
\t \t \t \t 
 
       startTimer() { 
 
        if (this.state.customNumber == "" || isNaN(this.state.customNumber)) 
 
        { 
 
         alert("Please give some value in number"); 
 
        } else { 
 
         clearInterval(this.timer) 
 
         this.timer = setInterval(this.tick.bind(this), 1000) 
 
         this.setState({ disabled: true }) 
 
        } 
 
       } 
 
       stopTimer() { 
 
        clearInterval(this.timer) 
 
       } 
 
       resetTimer() { 
 
        clearInterval(this.timer) 
 
        this.setState({count: 0, customNumber: this.state.lastInput}) 
 
        this.setState({ disabled: false }) 
 
       } 
 
       render() { 
 
        return (
 
        <div style={styles} className='timer'> 
 
         <h1 style={{fontSize: '4em'}}>{this.display()}</h1> 
 
\t \t \t \t \t \t <div className="input_text" style={inputs}> 
 
\t \t \t \t \t \t \t <label htmlFor="custom_number">Enter number to start timer</label> 
 
\t \t \t \t \t \t \t <input type="text" name="custom_number" id="custom_number" value={this.state.inputValue} onChange={this.handleChange.bind(this)} disabled={this.state.disabled} placeholder="Enter b/w 1-100" /> 
 
\t \t \t \t \t \t </div> 
 
         <div style={btns} className="buttons"> 
 
\t \t \t \t \t \t \t <button style={btn} type="button" name="start_btn" id="start_btn" onClick={this.startTimer.bind(this)}>Start</button> 
 
\t \t \t \t \t \t \t <button style={btn} type="button" name="stop_btn" id="stop_btn" onClick={this.stopTimer.bind(this)}>Pause</button> 
 
\t \t \t \t \t \t \t <button style={btn} type="button" name="reset_btn" id="reset_btn" onClick={this.resetTimer.bind(this)}>Stop</button> 
 
         </div> 
 
        </div> 
 
        ) 
 
       } 
 
      } 
 
      ReactDOM.render(<Timer />, document.getElementById('root')) 
 
     </script> 
 
     <div id="root"></div> 
 
    </body>  
 
</html>

+0

あなたのコードは機能していませんし、現在は "停止"ボタンも今働いていません –

+0

"Stop"ボタンをクリックすると値が上に表示されますが、 "Start"ボタンを押すと、与えられたvlaue。 –

+0

mmmm okですので、コードを編集して手伝ってください。 –

関連する問題