React + Flux を使ってみた感じのTODOリスト
Reactコンポーネントをこのファイルにまとめている。本来はコンポーネント毎に別ファイルにしてimportするべきかもしれない。
コンポーネントで発生するonClickなどのイベントを拾って TodoActions.remove(this.props.todo)
のようにTodoActionsに丸投げする。
TodoActionsは純粋なクラス。各種アクションを発生させるメソッドを保持し、アクション内容をオブジェクトとして整理してAppDispatcherに渡す。
npmでインストールしたfluxのDispatcherをnewするだけ。
データ本体。データを直接操作するcreate()やupdate()は外からは呼べないようになっていることがポイントだろうか。 その代わりTodoStoreクラス内で、AppDispatcherが持ってきたアクションに応じて適切なデータ操作がなされるように、AppDispatcher.register()関数で登録している。
またEventEmitterを継承しており、addListenerインターフェイスをもっているとともに、データに変更があった場合はemitして変更を通知するようになっている。
アクションの定義リスト。アプリケーションを作る時まずはConstantsを羅列すれば整理しやすいかも。
例として、一つのTODOを削除する機能を追加する場合の手順を述べる。
render()のreturnの一部。.bind(this)しないと_onClick()内でthis.propsが取れない。
<button onClick={this._onRemoveClick.bind(this)}>削除</button>
_onClick() {
TodoActions.remove(this.props.todo)
}
removeアクションをオブジェクトとしてまとめたものをAppDispatcher.dispatch()で渡す。
remove(todo) {
AppDispatcher.dispatch({
type: TodoConstants.TODO_REMOVE,
id: todo.id
});
}
定数を追加するだけなので省略。
まずTodoStoreクラスの外側に純粋なdestroy関数を作成する。
const destroy = (id) => {
delete _todos[id];
}
TodoStoreクラスのコンストラクタに、アクションタイプに応じてどのような操作するのかを示すswitch文があるので、そこにTODO_REMOVEアクションを追加する。データ変更を通知するためにemit()を呼んでいる。
case TodoConstants.TODO_REMOVE:
destroy(action.id);
this.emitChange();
break;
以上で削除ボタン機能を追加できる。