コンポーネントの作成
- 目標:コンポーネントを作成し、クライアントサイドで処理させて表示
- 学習:コンポーネントの構成要素、Sailsでの構築方法
概要
Reactはコンポーネント指向のUIライブラリです。すべての画面要素はコンポーネントとして作成し管理します。ルート要素もページ要素もフォームもパーツも、すべてコンポーネントとして作成します。
コンポーネント化するメリットは、「責務の分離」「再利用性の向上」だと思います。
実装
- コンポーネントの大枠
- Sailsでの単純なコンポーネント表示
コンポーネントの大枠
React.Component
をextendsすると、コンポーネントを作れる- コンポーネントが保持する状態は、コンストラクタで
this.state
として設定する render
関数でJSX
を記述すると、そのコンポーネントが表現するDOM要素を記述できる- JSXのDOM要素中にイベントハンドラを作成でき、コンポーネントの関数を呼び出せる
/assets/react/Main.js
※boilerplateに作りこみ済です。
'use strict';
import React from 'react';
// React.Componentクラスを継承する
export default class Main extends React.Component {
constructor() {
super();
// 自身の管理する状態変数を定義
this.state = {
count: 123
};
}
// 自身の状態を変更するためのハンドラ
_handleClick(e) {
const newCount = this.state.count + 1;
// 新しい、自身の状態を設定する。
// 必ずsetStateを使う。(使わないと状態がViewに反映されない)
this.setState({
count: newCount
});
}
render() {
// JSX記法。HTMLのように書ける。
// ※必ず1つのブロックでくくらなければならない
return (
<div>
<div>
{/* クリックイベントを、指定のハンドラにバインドできる */}
<button onClick={this._handleClick.bind(this)}>Click to Increment</button>
</div>
{/* 変数は自動で更新される */}
<span>{this.state.count}</span>
</div>
);
}
}
Sailsでの単純なコンポーネント表示
※boilerplateに作りこみ済です。
- HTMLテンプレート
- レンダリング処理のためのController
- URLルーティング設定
- クライアントサイドのエントリポイント
/views/react.ejs
id付きのdivブロックを1つ作り、Reactのレンダリングターゲットにする。
<div id="main">
</div>
/api/controllers/ViewController.js
レンダリングターゲットを出力するためのControllerを作成。
'use strict';
class ViewController {
first(req, res) {
res.view('react');
}
}
module.exports = new ViewController;
/config/routes.js
サーバサイドルーティング。rootのアクセスを、ViewController.firstに割り当てる。
module.exports.routes = {
'GET /': 'ViewController.first'
};
/assets/scripts/app.js
クライアントサイドのエントリポイント。Mainコンポーネントをdivに書き出すように指示。
import React from 'react/addons';
import Main from './main';
React.render( <Main />,
document.getElementById("main")
);