サクッとやりたいので、1ファイルでいきます。 フォーム表示の前にまずはHelloWorldの表示をしてみましょう。
Hello Worldを表示させる
<!DOCTYPE html> <head> <meta charset="UTF-8" /> <title>Hello, World</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/react.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/JSXTransformer.js"></script> </head> <body> <div id="content"></div> <script type="text/jsx"> var Hello = React.createClass({ render: function() { return ( <h1>Hello, World!</h1> ); }, }); React.render(<Hello />, document.getElementById('content')); </script> </body>
Hello worldはこれで表示できる。 やってることはHelloというcomponentを作って、それをidがcontentの要素の中に表示させている。
フォームを作る
<!DOCTYPE html> <head> <meta charset="UTF-8" /> <title>Hello, World</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/react.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/JSXTransformer.js"></script> </head> <body> <div id="content"></div> <script type="text/jsx"> var Form = React.createClass({ render: function() { return ( <form> <input type="text" ref='item'/> <input type='submit' value='message' /> </form> ); }, }); React.render(<Form />, document.getElementById('content')); </script> </body>
これでformは表示される。
今のままではただフォームの形を成しているだけなので、実際に動かしてみます。
<!DOCTYPE html> <head> <meta charset="UTF-8" /> <title>Form</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/react.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/JSXTransformer.js"></script> </head> <body> <div id="content"></div> <script type="text/jsx"> var Form = React.createClass({ handleSubmit: function(e) { e.preventDefault(); console.log("こんにちは"); }, render: function() { return ( <form onSubmit={this.handleSubmit}> <input type="text"/> <input type="submit" /> </form> ); } }); React.render(<Form />, document.getElementById('content')); </script> </body>
onSubmitを使って送信時には、handleSubmit
を動かすようにします。
これは表示されますね。
<!DOCTYPE html> <head> <meta charset="UTF-8" /> <title>Form</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/react.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/JSXTransformer.js"></script> </head> <body> <div id="content"></div> <script type="text/jsx"> var Form = React.createClass({ getInitialState: function(){ return{ name: '' } }, handleSubmit: function(e) { e.preventDefault(); console.log(e.target.value); }, render: function() { return ( <form onSubmit={this.handleSubmit}> <input value={this.state.name} type="text"/> <input type="submit" /> </form> ); } }); React.render(<Form />, document.getElementById('content')); </script> </body>
では、これはどうでしょう。 もはやフォームに入力することができません。defaultValueなんかを使えば、入力することはできるようになります。
入力した値を表示させる
<!DOCTYPE html> <head> <meta charset="UTF-8" /> <title>Form</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/react.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/JSXTransformer.js"></script> </head> <body> <div id="content"></div> <script type="text/jsx"> var Form = React.createClass({ getInitialState: function(){ return{ name: '' } }, handleClick: function(e){ this.setState({name: e.target.value}); }, handleSubmit: function(e) { e.preventDefault(); console.log(this.state.name); }, render: function() { return ( <form onSubmit={this.handleSubmit}> <input value={this.state.name} type="text" onChange={this.handleClick}/> <input type="submit" /> </form> ); } }); React.render(<Form />, document.getElementById('content')); </script> </body>
何か文字が変更されるとonChange
のhandleClick
が動き、stateのnameが更新され、onSubmit
するとその更新されたnameがコンソールに出力されます。
入力した内容を画面に表示させる
<!DOCTYPE html> <head> <meta charset="UTF-8" /> <title>Form</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/react.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/JSXTransformer.js"></script> </head> <body> <div id="content"></div> <script type="text/jsx"> var Form = React.createClass({ getInitialState: function(){ return{ name: '' } }, handleClick: function(e){ this.setState({name: e.target.value}); }, handleSubmit: function(e) { e.preventDefault(); console.log(this.state.name); }, render: function() { return ( <div> <form onSubmit={this.handleSubmit}> <input value={this.state.name} type="text" onChange={this.handleClick}/> <input type="submit" /> </form> {this.state.name} </div> ); } }); React.render(<Form />, document.getElementById('content')); </script> </body>
次は画面に表示してみましょう。
formの下にthis.state.name
を追記しただけです。
リアルタイムで確認できるので、気持ちいいですね。 どのように表示されているかというと、こんな流れです。
文字が入力される→handleClickが呼ばれる→setStateでnameの値が更新される→{this.state.name}はstateのnameを反映するので、表示される
みたいな感じですね。