WEBOPIXEL

React入門

Posted: 2018.08.17 / Category: javascript / Tag: 

WordPressの次世代エディターのGutenbergはReactで作られているらしいですよ。
ということですので、Reactちょっとはじめてみました。

Sponsored Link

開発環境の構築

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
Welcome to React

これで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で更新することで、表示されている部分も自動的に更新されます。