初歩的な概念しか記載していませんが、以下の用語やデータフローは最低限理解しておきましょう。さらに理解を深めたい場合は公式ドキュメントを参照してください。
http://rackt.org/redux/docs/introduction/ThreePrinciples.html
1.Single source of truth(ソースは1つだけ) |
---|
アプリケーション全体の状態(state )はツリーの形で1つのオブジェクトで作られ、1つのストアに保存される。state が保存しやすいので、ユニバーサルアプリケーションがつくりやすい。state が1つだから、デバッグしやすい、開発しやすい。 |
2.State is read-only(状態は読み取り専用) |
---|
状態を変更する手段は、変更内容をもったActionオブジェクトを発行して実行するだけ。ビューやコールバックが状態を直接変更させることはできない。変更は一つずつ順番に行なわれる。Actionはオブジェクトなので、保存可能であり、テストしやすい。 |
3.Mutations are written as pure functions(変更はすべてpureな関数で書かれる) |
---|
アクションがどのように状態を変更するかをReducer で行う。Reducer は状態とアクションを受けて新しい状態を返す関数です。現在のstate を変更することはせずに、新しいstate オブジェクトを作って返すというのがポイント。最初はアプリケーションで一つのReducer を用意して、巨大化してきたらReducer を分割していく。 |
- アプリケーションからの情報を
store
へ送る為のオブジェクト store.dispatch()
でstore
へ送られる- 何を行なうものかを識別するために
type
プロパティを必ず持つ。このtype
をActionType
と呼ぶ。
const ADD_TODO = 'ADD_TODO';
{
type: ADD_TODO,
text: 'Build my first Redux app'
};
Actionを作る関数です。
function addTodo(text) {
return {
type: ADD_TODO,
text: text
};
}
dispatch
するときはcreator
で作成したaction()
を渡します。
dispatch(addTodo(text));
役割
state
を保持するstate
へアクセスするためのgetState()
を提供するstate
を更新するためのdispatch(action)
を提供する- リスナーを登録するための
subscribe(listener)
を提供する
store
は必ず1つのみ。state
ごとにロジックを分割したい場合は、store
を分割せずにreducer composition
を使用してください。
store
をつくるには、combineReducer
でつくられたreducer
をcreateStore()
へ渡します。
import { createStore } from 'redux';
import todoApp from './reducers';
const store = createStore(todoApp);
- 現在の
state
とaction
を受けて新しいstate
を返すだけの純粋なメソッドです。
(previousState, action) => newState;
reducer
の中で以下のことをやってはいけません
- 引数の
state
,action
インスタンスの値を変更する - 副作用を起こす(APIを呼んだり、ルーティングを変えるなど)
- 毎回値が変わるもの(
Date.now()
やMath.random()
)を扱う
dispatch
する前後にそれぞれ任意の処理を追加することができる仕組みdispatch
前後のstate
の状態をログ出力する等- npmに有志によって実装されたMiddlewareが上がっているので適宜使用する https://www.npmjs.com/search?q=redux%20middleware https://github.com/xgrommx/awesome-redux