The source code for this blog is available on GitHub.

Blog.

Reactを学ぶ6(Redux)

Cover Image for Reactを学ぶ6(Redux)

以下を参考に。 今から始めるReact入門 〜 Redux 編: Redux 単体で状態管理をしっかり理解する

作業時間:3時間 経過時間:24時間

データフロー

createStore()はReducerとデータの初期値を渡す store.getState()はstateの取得 store.dispatch()を呼ぶと、subscribe()が発火する。 reducerの実行タイミングは、createStore()とdispatch()の時になる。 reducerを複数扱う場合は、combineReducersでreducerをオブジェクト形式で集約し、各reducerにactionを渡す。

middleware

Reduxでmiddlewareと組み合わせる。 reducerの前に処理をしたいケースがある際に利用する。(APIのデータ取得、ログ出力...) applyMiddleware()で引数に関数を渡す。 以下のapplyMiddlewareで呼ぶ関数ではカリー化で渡している。

dispatchのあとの処理順序は、middleware、reducerとなっている。 なので、middlewareで呼んだ関数でreducerを呼ぶ?必要がある。 ※middlewareでは、actionに干渉できてしまうので、副作用を持ってしまう可能性がある。

//reducerが呼ばれない
 const logger = (store) => (next) => (action) => {
   console.log("action fired", action);
}
const middleware = applyMiddleware(logger);
...
const store = createStore(reducer, 1, middleware);
//reducerが呼ぶ
 const logger = (store) => (next) => (action) => {
   console.log("action fired", action);
   next(action);
}
const middleware = applyMiddleware(logger);
...
const store = createStore(reducer, 1, middleware);

  複数のmiddlewareを定義する場合は、applyMiddleware()で定義した関数を渡せばいい。

非同期

dispatch()に関数を渡して、その関数内で非同期処理を行う。 通常のままだとmiddlewareでは、Actionオブジェクトを受け取ることを期待している。 なので、redux-thunkを使用しmiddlewareで関数を受け取れるようにする。 middlewareの先でdispatchメソッドを受け取り、非同期関数を実行する。

redux-promiseでも非同期を解決できる。 そして、redux-sageでも...。 だけど、どんな違いがあるかは分かっていない。

何かしらをapplyMiddlewareへの渡し方が違うが、渡すことは確かだった。

疑問

cookieとかの方面でstore管理しなかったの何故だろうとおもったけど、書き込み権限しかないからか。


More Stories