開発環境の構築
Reactはスタティックなファイルを読み込んでも始めることはできますが、JSXとかES6とかで書くのがスタンダードになってますので、その辺りの環境を作っていくことから始めます。
とりあえずNode.jsは入っているものとします。
create-react-app
というFacebookが提供しているパッケージがありますので、これを利用すると始めやすいと思います。
適当なディレクトリでターミナルから下記を実行してtest
というプロジェクトディレクトリを作成します。
$ npx create-react-app test
npxというのがあまり見慣れませんが、Node.jsを入れてnpmが使用できる環境なら使えます。
あとはカレントディレクトリを作成したtest
にして、npm start
を実行するとブラウザが起動してWelcome to Reactと表示されます。
$ cd test $ npm start
これでsrc
内のファイルが監視されて、ファイルを保存すると自動的にビルドが実行されブラウザが更新されるようになります。
環境の構築といっても以上となります。簡単ですね。
JSXで文字列の表示
src
ディレクトリの中には色々ファイルが入っています。
その中にあるApp.js
を開いて下記に編集してください。
src/App.js
import React, { Component } from 'react'; class App extends Component { render() { return ( <div> <p>はじめてのReact</p> </div> ); } } export default App;
ブラウザで確認すると「はじめてのReact」と表示されます。
render関数のreturnしたタグがそのまま表示されていますね。
JSの中にHTMLタグがいきなり入っていてすげえ気持ち悪いって言う人もいるかもしれませんが、これがJSXの力らしいですよ。
JSXで変数の表示
変数を使用してJSXで表示してみましょう。
src/App.js
class App extends Component { render() { let str = 'はじめてのReact'; return ( <div> <p>{ str }</p> </div> ); } }
JSX内では{}
で変数を囲むことで、表示することができます。
別のコンポーネントを使用する
アプリケーションは複数のコンポーネントを組み合わせて作成することになると思います。
コンポーネントを新たに作成して、別にコンポーネントから表示してみましょう。
src/App.js
class Message extends Component { render() { return ( <p>別のコンポーネント</p> ); } } class App extends Component { render() { return ( <div> <Message /> </div> ); } }
コンポーネントは次のように関数で作成することもできます。
const Message = () => { return ( <p>別のコンポーネント</p> ); };
関数の方が記述も動作も高速ですが、stateやライフサイクルなどクラスでしか使えない機能もあります。
別のコンポーネントにデータを渡す
外部のコンポーネントからデータを受け取り、より柔軟なコンポーネントを作成してみます。
const Message = (props) => { return ( <p>{ props.str }</p> ); }; class App extends Component { render() { return ( <div> <Message str="メッセージを渡す。" /> </div> ); } }
作成したコンポーネントの関数の引数にオブジェクト変数(props)が渡されます。
ここではstr
のプロパティを表示してますので、コンポーネントを使用するときにstr
属性の指定をします。
データを渡す方法は属性で指定する他にもコンポーネントタグに値を挟んで渡す方法もあります。
その場合、定義して関数ではprops.children
で表示することができます。
const Message = (props) => { return ( <p>{ props.children }</p> ); }; class App extends Component { render() { return ( <div> <Message>メッセージを渡す。</Message> </div> ); } }
配列をリスト表示
配列をリスト表示したいっていうのは結構あると思います。
class App extends Component { render() { let datas = [ {id: 1, name:'山田'}, {id: 2, name:'田中'}, {id: 3, name:'鈴木'} ]; const list = datas.map(data => { return <li key={ data.id }>{ data.name }</li> }); return ( <div> <ul>{ list }</ul> </div> ); } }
配列のmap
で一度JSXを変数に入れてから、return
で表示してます。
li
にはkey
がないとエラーになります。
リアルタイムで表示を更新する
最後にstate
を使用して、テキストフォームで入力した内容をリアルタイムで更新して表示してみます。
class App extends Component { constructor(props) { super(props); this.state = { str: '' } this.handleChange = this.handleChange.bind(this); } handleChange(e) { this.setState({ str: e.target.value }); } render() { return ( <div> { this.state.str }<br /> <input onChange={ this.handleChange } /> </div> ); } }
state
に設定したプロパティはsetState
で更新することで、表示されている部分も自動的に更新されます。