-
Notifications
You must be signed in to change notification settings - Fork 0
DNET_Redux
- 戻る(Reactの該当節を参照)
- Fluxアーキテクチャに基づいて設計されたReact用フレームワーク
- Fluxの影響を受けていることから、データの流れは一方向になる。
- 「複数の画面で同じデータを共有し、更新頻度が高い複雑なアプリケーション」において最強の武器。
アプリケーション全体の「状態(State)」を1つの大きなツリー(Store)で管理(Single Source of Truth)。
-
コンポーネント間でデータをバケツリレー(Props Drilling)する必要がなくなる。
-
これにより、データの不整合が起きにくくなり、デバッグが容易になる。
-
Reduxによる、バケツリレー実装のソリューション
- コンポーネントの縦方向(深さ)に対してバケツリレー実装が増える(中間コンポーネントが不要なpropsを中継)。
- コンポーネントの横方向(幅)に対してバケツリレー実装が増える(共通の親が仲介者として状態を持たされる)。
- トップに1つのStore、使う状態をSliceで分け、ページによってReduxを使用する・しないを変える事が出来る。
状態は直接変更できず「Reducer」という純粋関数を通じてのみ状態を更新。
- 「いつ、どこで、誰が、なぜ」状態を変更したのかが完全に追跡可能に。
- 複雑なロジックでも、同じアクションを与えれば必ず同じ状態に遷移する。
開発を強力にサポートするブラウザ拡張機能がある(Redux DevTools)。
- 過去に発行されたアクションを遡ったり、特定の時点の状態に戻したりできる。
- 全ステートをリアルタイムで監視・編集できるため、早期に不具合の原因特定が可能。
「Reducer」は、外部に依存しない純粋関数として記述。
- 副作用がないため、単体テスト(Unit Test)を書くのが非常に簡単。
- コードの品質が向上し、メンテナンスがしやすくなる。
学習コストが比較的高く、記述量が増えるため、小規模開発ではオーバー・エンジニアリング。
状態遷移が明確でバグが減るが、記述量(ボイラープレート)が増える。
タイムトラベル機能で追跡が容易だが、学習コストが比較的高い。
大規模でも秩序を保てるが、小規模ではオーバー・エンジニアリング
- Actions -> Reducers -> Storeの3つの部分から構成される。
- Storeが状態を持ち、Actionが発生した際に、Reducerを使ってStoreの状態を更新する。
- Viewに関しては、Storeの用意するAPIを使うことで、状態の購読、更新・取得ができる。
状態は一つのStoreのobjectツリーに格納される。
Actionを発火することが、状態を更新する唯一の方法。
状態がActionによってどのように変更されるか、
定義するために純粋な(副作用のない)Reducerを書く。
-
View等から発火されて作られるオブジェクト
-
実体
{ type: "アクションの種類を一意に識別できる文字列またはシンボル", payload: "アクションの実行に必要な任意のデータ", }
-
定義(actions.js)
export const ACTION_TYPE = 'アクションの種類を一意に識別できる文字列またはシンボル'; export const ActionType = hoge_value => ({type: ACTION_TYPE , payload: hoge_value });
-
-
Viewのconnect関数のmapDispatchToProps引数(デリゲート)で定義・生成される。
-
Flux の Dispatcher(Fluxの該当節を参照)の代替。
-
関数型プログラミングにおいて畳み込み演算を意味する副作用のない関数。
- 初期状態はデフォルト引数で定義される。
- 状態を変更するには、新しいものを合成するように書く。
-
定義(reducer.js)
import { ACTION_TYPE } from './actions'; export default (state = {value: 0}, action) => { switch (action.type) { case ACTION_TYPE: return { ...state, value: state.value + action.payload }; default: return state; } }
-
大規模な開発においてReducerを細かく分割する場合は、
combineReducersという関数を用いて書く。import { combineReducers } from 'redux'; const XXXXReducer = (state = {...json...}, payload) => { /* 省略 */ }; const YYYYReducer = (state = {...json...}, payload) => { /* 省略 */ }; const ZZZZReducer = (state = [...json...], payload) => { /* 省略 */ }; export default combineReducers({ XXXX: XXXXReducer, YYYY: YYYYReducer, ZZZZ: ZZZZReducer, })
-
- シングルトンで、インスタンスの管理不要。
- 状態(state)を格納する。
- アプリケーションに必ず1つしか設けられない。
- 1つのStoreですべての状態を管理する。
- イメージとしては「でっかいJSONの塊」。
-
Reduxに参加するためにはReactReduxによって提供されるconnect関数を用いる。
-
react-reduxをインストールして、
npm install react-redux --save -
react-reduxをインポートする。
import { connect } from 'react-redux';
-
-
変更は、propsを通じて渡されてくるので、
connect(mapStateToProps, mapDispatchToProps)(Component)
-
connect関数のmapStateToProps引数(デリゲート)は、stateとpropsのバインディングを定義する。
-
以下のように書いても動作するが、
state => state
-
以下のように必要なものだけを選別してpropsにバインドする。
state => ({ value: state.value })
-
-
connect関数のmapDispatchToProps引数(デリゲート)は、
-
dispatchで、Reducerに向けた通知を定義する。
{ ActionType }
-
Actionsの定義は、以下のようにインポートする。
import { ActionType } from './actions';
-
-
-
Container
-
以下のようなケースでは、Containerが集約してconnect関数でバインドする。
(<UsersList> <User /> <User /> <User /> <User /> </UsersList>)
-
可読性を高めるため、Componentとディレクトリが分けられることが多い。
-
Reactコンポーネント自身が個別に状態管理をする。
-
状態管理する専用の場所(Flux の Store)で状態管理する。
-
Reactコンポーネントはそれを映すだけに徹する。
-
コードの削減と関数の再利用性の向上
- javascript - Why use Redux over Facebook Flux? - Stack Overflow
http://stackoverflow.com/questions/32461229/why-use-redux-over-facebook-flux
-
Reduxは、最小限で、フルスタックとは言えない薄さ。
(なので、機能を補う幾つかのサブ・プロジェクトがある) -
副作用を生む処理の設計の指針について、
模索が必要で、その筆頭が 非同期処理の扱いになる。- 処理をどこに書くのか、
- どのように書くのか、
- どこから呼び出すべきか、
-
解決方法としてredux-sagaがある。
(元 Wiki では未記載)
- redux-sagaで非同期処理と戦う
https://qiita.com/kuy/items/716affc808ebb3e1e8ac - Redux-Observable Epic vs Redux-Saga: 何が問題なのか | POSTD
https://postd.cc/redux-observable-epics-vs-redux-sagas/
- redux
- redux-thunk
- redux-promise
- react-side-effect
- 「戻り値の値」を変えることを「作用」
- 「戻り値以外の値」を変えることを「副作用」
- オブジェクト指向と関数型で副作用の扱いが違うって知ってた? - セカイノカタチ
https://qtamaki.hatenablog.com/entry/2015/01/16/135703
以下のようなツールが存在しているらしい。
-
概要
- デバッグし易くなるらしい。
- ...。
-
参考
-
zalmoxisus/redux-devtools-extension: Redux DevTools extension.
https://github.com/zalmoxisus/redux-devtools-extension -
Reduxのデバックに必須!Redux DevToolsの使い方 | Harkerblog
https://harkerhack.com/react-redux-devtools -
Qiita
- Redux Devtools Extensionを使った時のこの感動を伝えたい
https://qiita.com/daiki7nohe/items/fa0f496eebb0980f86da - Redux 開発で絶対使うべき Redux DevTools Extension 解説
https://qiita.com/elzup/items/fc24588b2c6bae0834a6
- Redux Devtools Extensionを使った時のこの感動を伝えたい
-
-
概要
- 手書きでやるのはドMらしいです。
- Ducksスタイルを強要され、後付が困難か?
-
参考
-
Redux Toolkit
https://redux-toolkit.js.org/ -
HookとRedux ToolkitでReact Reduxに入門する | Hypertext Candy
https://www.hypertextcandy.com/learn-react-redux-with-hooks-and-redux-starter-kit -
Qiita
- Redux の記述量多すぎなので、 Redux の公式ツールでとことん楽をする。 ( Redux Toolkit)
https://qiita.com/Ouvill/items/a76e9cbce569d01f2931 - Redux Toolkit で Redux の煩わしさから解放される
https://qiita.com/__sakito__/items/e446d0f0974f2e12a5f5
- Redux の記述量多すぎなので、 Redux の公式ツールでとことん楽をする。 ( Redux Toolkit)
-
-
モジュールが分割できるのは良い。
-
ただし、
-
トラブル・シューティングが困難
- combineReducersを使うとStoreが階層化される(Reactのセカンド・ステップの該当節を参照)
- Uncaught TypeError: this.props.XXXX is not a function
-
パターン
- ...から外れると途端に(設計/実装に関して)何をしてイイか解らなくなる。
- ...を決めて最小セットを作成してそれに準拠して開発する必要がある。
-
-
やった感想として、
- 複雑でパターン化&RADのIDEによるサポートが無いと厳しい気がする。
- 早々に、Hooksに行ってしまうのがイイのかも知れない。
-
Qiita
- react-reduxで「dispatch is not a function」にハマった場合の対処法
https://qiita.com/gaku3601/items/f77523bca6661f72f46a - Reduxは不要ではないか?
https://qiita.com/daijinload/items/c7015b1117c5beb7e49f - 【Reduxに疲れた人のための】Undux入門
https://qiita.com/IzumiSy/items/c26f69219178b79f586d - React Nativeの実は使ってはダメなライブラリ素晴らしいライブラリ(随時更新)
https://qiita.com/kaba/items/569aafd80889bb5d9328
- react-reduxで「dispatch is not a function」にハマった場合の対処法
-
mizchi の Redux 考 - Togetter
https://togetter.com/li/911228 -
React-Reduxの使い方をやっと覚えたので動かした
https://naokeyzmt.com/blog/react-redux-handson/ -
JavaScript: Reduxが必要なとき/不要なとき(翻訳)
TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社
https://techracho.bpsinc.jp/hachi8833/2018_03_13/53183 -
JSフレームワーク事情2020年始め|erukiti|note
https://note.com/erukiti/n/na654ad7bd9bb
-
Usage with React - Redux
https://redux.js.org/basics/usage-with-react -
Reduxの実装とReactとの連携を超シンプルなサンプルを使って解説 | maesblog
https://mae.chab.in/archives/2885 -
React + Redux で SPA を作る | ギャップロ
https://www.gaprot.jp/pickup/react-redux-spa -
イメージで覚えるReact + Redux - ユニファ開発者ブログ
http://tech.unifa-e.com/entry/2017/07/10/135509
-
結局FluxやらReduxやらって何なのか個人的なまとめ
https://qiita.com/syossan27/items/7e1b2e07ac68b96bdaa7 -
たぶんこれが一番分かりやすいと思います React + Redux のフロー図解
https://qiita.com/mpyw/items/a816c6380219b1d5a3bf- Tutorial: Intro To React - React
https://reactjs.org/tutorial/tutorial.html - Example: Todo List - Redux
https://redux.js.org/basics/example-todo-list
- Tutorial: Intro To React - React
-
Redux入門【ダイジェスト版】10分で理解するReduxの基礎
https://qiita.com/kiita312/items/49a1f03445b19cf407b7- 1日目 Reduxとは
http://qiita.com/kiita312/items/b001839150ab04a6a427 - 2日目 Reduxの基本・Actions
http://qiita.com/kiita312/items/8f8d047e5cbd87399ccb - 3日目 Reduxの基本・Reducers
http://qiita.com/kiita312/items/7fdce94912d6d9c801f8 - 4日目 Reduxの基本・Stores
http://qiita.com/kiita312/items/377787c24efac64f2495 - 5日目 Reduxの基本・Data Flow
http://qiita.com/kiita312/items/ae3ce31521ad24dd699f - 6日目 ReduxとReactの連携
http://qiita.com/kiita312/items/d769c85f446994349b52
- 1日目 Reduxとは
-
React+Redux入門
https://qiita.com/erukiti/items/e16aa13ad81d5938374e -
ざっくり React with Redux チュートリアル
https://qiita.com/pullphone/items/d28baeb296666a4847b8 -
最小のReact+Redux
https://qiita.com/Chayata/items/28bc6f6af4bc41e89e03 -
Redux勉強用に簡単なサンプルを作ってみた
https://qiita.com/DJ_Middle/items/ffa08f983df471a5c6f8
-
モバイル上のJSフレームワークの実行可能性 – ReactとRedux
https://postd.cc/viability-of-js-frameworks-on-mobile/ -
Angular 2アプリケーションをimmutable.jsとReduxで構築する
https://postd.cc/angular2-with-immutablejs-and-redux/ -
Reduxのパターンとアンチパターン
https://postd.cc/redux-patterns-and-anti-patterns/ -
Redux-Observable Epic vs Redux-Saga: 何が問題なのか
https://postd.cc/redux-observable-epics-vs-redux-sagas/
- Vueを昔触った後Reactをどっぷり触ってもう一回Vueを触ってReactに戻って得た感想
https://medium.com/inuscript/vue-and-react-comparision-6c7cb44f18ba
移行メモ
- 「アプリケーションに必ず1つしか設けらない。」→「設けられない。」に修正した。
- 「Fluxとの違い」の節にある Store / Dispatcher のリンクは、 元 Wiki では同ページ内アンカ(
#p3c60442/#o1ac7ccf)として書かれていたが、 実際には Flux ページ側のアンカのため、同ページの該当節への参照に置き換えた。- 「定義(actions.js」「定義(reducer.js」の閉じ括弧の欠落を補った。
- 同名の見出し(「概要」「参考」「詳細」「その他」)が複数あり GitHub Wiki でアンカが衝突するため、括弧で文脈を補って一意にした。
- マイクロソフト系技術情報 Wiki(techinfoofmicrosofttech.osscons.jp)への URL リンクは、移行済みの ASP.NET Core React+Reduxテンプレート に張り替えた。
- PukiWiki のページ内アンカ(
#xxxxxxxx)は GitHub Wiki では再現できないため、 同一ページ内のアンカは見出しから生成されるアンカに張り替え、 他ページのアンカを指すリンクは「〜(ページ名の該当節を参照)」の形に置き換えた。
Tags: 移行, Redux, React, Flux, Store, Reducer, Action, 状態管理, Redux Toolkit, redux-saga
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。