ReactJS の tutorial から学んでみる。
と言っても昨日 18時から20時までチュートリアルコードを読んで試しただけだが。
まず ReactJS ってなんぞやって話だと、下記を参照。
BUILDING USER INTERFACES
と銘打ってはいるものの、フロントエンド MVC と言っても過言ではなさそうだ。
で、チュートリアル Tutorial | React をやった感じから、どんなフレームワークなのかを感じたままに書いてみる。
UI とロジックの共存
ユーザインターフェースが最優先だと銘打っているだけあり、JSX を使ったロジックとHTMLの融合が特徴の一つだ。
速攻で理解できるのが下記。
<html> <head> <title>Example</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/marked/0.3.2/marked.min.js"></script> </head> <body> <div id="content"></div> <script src="/javascripts/jquery.min.js"></script> <script src="/javascripts/react-with-addons.min.js"></script> <script src="/javascripts/components/example.js"></script> </body> </html>
example.js は下記の JSX ファイルをコンパイルして生成
React.render( <h1>Welcome to my broken show</h1>, document.getElementById('content') );
コード内に HTML を書くという行為に最初は思うところもあるが、とりあえず置いておく。
実際ここに書くのはどっちかというとテンプレートに近いのであんまり気にしても仕方ない。
コンポーネント指向
React はコンポーネント指向と言っていい考え方をしている。
var Comment = React.createClass({ render: function() { return ( <div className="comment"> <h2 className="commentAuthor"> {this.props.author} </h2> {this.props.children} </div> ); } }); React.render( <Comment author="azalea">ほげっとな</Comment>, document.getElementById('content') );
createClass でコンポーネントを定義して、レンダリング時にタグの一部として呼び出せる。まるで XAML だ。
属性とコンテンツを与えると、呼び出し先では props 経由でアクセス可能。
FLUX による常に一方通行なコンポーネント
flux がどういうものかというと、初期化の完了後に下記のサイクルで画面を更新している。
イベント発生 → イベントをディスパッチ → Store にデータを格納 → Store の状態を見て View をレンダリング
という線形的な変更が行われる。
ここで重要な事は、画面の状態をプログラム側で意識せずに、常に「今の状態でどう表示するか」でしかないところだ。
ステートレス!これが最高に気持ちがいい。
(管理する状態が増えればバグが増える、これ関数型の常識)
イベント駆動
コンポーネントごとにイベント管理するスタイルで、イベント駆動の側面がある。
とりあえずチュートリアル上で気づいた createClass 後のハンドラを下記に挙げる。
- render : レンダリングする
- getInitialState : コンポーネント初期化時に呼び出される。内部保持している state の初期状態を設定する。
- componentDidMount : 初期化直後に一度だけ実行される。初期化が実行され、配置完了時に呼び出される。
あと、フォーム上のイベントを下記のような感じで設定してる。
var CommentForm = React.createClass({ handleSubmit: function(e) { e.preventDefault(); // ここでイベント処理 return; }, render: function() { return ( <form className="commentForm" onSubmit={this.handleSubmit}> <!-- 略 --> </form> ); } });
jquery の hover とかどういう風にとるのかまでは少々わからんが…。
なんにせよ、これで色々作れそうな気がする。