-
Notifications
You must be signed in to change notification settings - Fork 0
DNET_ReactSecondStep
- 戻る(React -> Redux)
- Reactのファースト・ステップ
- Reactのセカンド・ステップ
- Reactのサード・ステップ
- Reactの4thステップ
- Reactの5thステップ
- ...Reactのファースト・ステップ2
create-react-appを使用した、React + Reduxの step by step。
色々悩んだが(と言うか、コチラの手順2の Redux 化に失敗したため)、
先ずは、以下の「Example: Todo List」のClass化版をやることに。
- React+Redux で Todoアプリを作ってみる │ Web備忘録
https://webbibouroku.com/Blog/Article/react-redux-todo - React Redux勝手にチュートリアル(TODO List) - TOEIC940点の文系プログラマー
http://uraway.hatenablog.com/entry/2016/02/12/182048
ココでは、Web備忘録の方をやってみた。
─ src/
├─ App.js
├─ index.js
├┬ actions/
│└─ Todo.js
├┬ components/
│└─ Todo.js
├┬ containers/
│└─ Todo.js
├┬ reducers/
│└─ Todo.js
└── createStore.js
>create-react-app react-redux-todo
>npm install --save redux react-redux redux-logger
デバッグ設定(Reactのファースト・ステップの「手順4」を参照)を行っておく。
以下を見ても明らかだが、
Entry Point, Component, Action, Reducer
と、複数のモジュールを行き来してシンドい。
-
createStore.jsを作成する。
-
ポイント
-
combineReducersをココで書いている。
-
applyMiddlewareで、
Reduxの状態遷移をコンソール上に表示する
redux-logger ミドルウェアを追加する。
-
- reducers/Todo.jsを作成する。
前述のStoreでimportしているReducerを仮で作成。
-
index.jsに組込む。
- createStoreして、storeを生成する。
- AppタグをProviderタグでラップしつつstore属性にstoreを設定。
-
ここで一度 npm start コマンドを実行し動作することを確認。
- components/Todo.jsを作成する。
- そして、App.jsを修正してTodoを呼び出す。
- actions/Todo.jsを作成する。
-
Reducer(仮)のreducers/Todo.jsにActionに対応した処理を実装する。
-
Actionから渡された値を「処理して」Componentに渡す。の処理の部分。
-
ポイント
- 初期値はinitialStateで定義して使用する。
- state は書き換えるのではなく新たなオブジェクトとするので、
Object.assignでディープコピーし、それに値を設定し、戻り値とする。
-
containers/Todo.jsを作成する。
-
そして、App.jsを修正してTodoをComponentからContainerに切り替える。
-
ポイント:ここでconnectする。
- components/Todo.jsで、propsのstateとfunctionを参照するように変更する。
-
Todoアプリを実行して動作確認する。
-
デバッグ実行(Reactのファースト・ステップの「手順4」を参照)すると、redux-logger ミドルウェアで、
Redux の状態遷移はコンソール上に表示される。
https://github.com/OpenTouryoProject/SampleProgram/tree/master/Template/SPATemplate/react-redux-todo
「Example: Todo List」が動作したので、
先程失敗したコチラの手順2の Redux 化に再チャレンジ。
>npm install --save redux react-redux redux-logger
デバッグ設定(Reactのファースト・ステップの「手順4」を参照)を行っておく。
以下の辺りに注意しながら実装する。
- redux-loggerを使用
- createStoreの定義
- Actionの分割
- Reducerの書き方
- Containerの使用
- Componentからの参照方法
-
またも動かない。
-
redux-loggerで、Reducersが動いていることは確認できるが、
Component側が更新されない(State -> Componentの再実行がかかってない)。 -
散々調べた挙げ句、原因は下で、
-
combineReducersを使うと以下のようにStoreが階層化されるため、
{"Menu1":{"counter":0},"Menu2":{"counter":0}} -
mapStateToPropsで、コレを考慮した設定にする必要があった。
const mapStateToProps = state => { return { counter: state.Menu1.counter } }
-
-
Redux さん、もっと、
- 使い易さと、
- デバッグし易さを、
考えて設計して欲しい感がある。
- combineReducersでハマったメモ
https://qiita.com/usagi-f/items/ae568fb64c2eac882d05
Componentを跨ぐという初歩的なことも良く解らないので、
ネットを調べて以下の参考ページを発見したのでやってみる。
Menu1、Menu2のContainerを集約するContainer, Action, Reducerを、Menu12に集約。
- Containerネストは不可能なので(当時そう思っていた)、Containerを集約する。
- 従ってContainer以外にも、 Action, Reducerの集約を行う。
- 親Containerから子Componentへは、propsを使用してstateとfunctionを渡す。
無事、動作!
-
Stack Overflow
- javascript - React & Redux : connect() to multiple components & best practices
https://stackoverflow.com/questions/35032204/react-redux-connect-to-multiple-components-best-practices - reactjs - React Redux: More containers v.s. less containers
https://stackoverflow.com/questions/39377712/react-redux-more-containers-v-s-less-containers
- javascript - React & Redux : connect() to multiple components & best practices
-
Qiita
- 何をreduxのコンテナにするか
https://qiita.com/halhide/items/b9c80b69630ac89b8797
- 何をreduxのコンテナにするか
https://github.com/OpenTouryoProject/SampleProgram/tree/master/Template/SPATemplate/redux_app
- 改めて、コチラの手順3の Redux 化
-
ASP.NET Core React+Reduxテンプレートの下記の新しい要素も追加する。
- ページング処理
- Hot Reloading
- redux-thunkによる非同期処理
-
コチラの手順3をコピーしてredux_templateにリネーム。
-
必要に応じて npmのインストール・コマンド(npmのコマンドの該当節を参照)で
node_modulesを復元する必要がある。npm i
デバッグ設定(Reactのファースト・ステップの「手順4」を参照)を行っておく。
-
既知のモジュール
>npm install --save redux react-redux redux-logger -
ASP.NET Core React+Reduxテンプレートの新しいモジュール
>npm install --save redux-thunk react-router-redux node-noop history domain-task
- 手順1の手順を参考に、本丸の Redux 化に取り掛かる。
- Counter、FetchDataの順にモジュールを追加していくと良い。
-
createStore.jsを作成する。
-
ポイント
- combineReducersをココで書いている。
- applyMiddlewareで、
- Reduxの状態遷移をコンソール上に表示する redux-logger ミドルウェアを追加する。
- 非同期処理を行うための thunk ミドルウェアを追加する。
- 仮のReducerを作成
- Counter、FetchDataの順にモジュールを追加
-
index.jsに組込む。
-
createStoreして、storeを生成する。
-
AppContainerタグをProviderタグでラップしつつstore属性にstoreを設定。
(以下のようなスニペットを発見したので、そのまま適用)ReactDOM.render( <Provider store={store}> <AppContainer /> </Provider>, ・・・
-
-
また、routes.jsにページング処理のためのBrowserRouterを組込む。
-
BrowserRouterのインポート
import { BrowserRouter as Router, Route } from 'react-router-dom'
-
LayoutタグをBrowserRouterのタグで囲む(なお、?はnull許容のもよう)
<Router> <Layout> ・・・ <Route path='/fetchdata/:startDateIndex?' component={ FetchData } /> </Layout> </Router>
-
-
ここで一度 npm start コマンドを実行し動作することを確認。
作成済みなのでココでは何もしない。
-
Actionを作成
-
Counter、FetchDataの順にモジュールを追加
-
ポイント
- Counterは通常通り。
- FetchDataは
- 非同期処理自体をReducerではなくココに定義。
- 非同期処理の結果として、通常のActionを呼び出す。
-
Reducer(仮)のreducers/Counter、FetchData.jsにActionに対応した処理を実装する。
-
Actionから渡された値を「処理して」Componentに渡す。の処理の部分。
-
ポイント
- 初期値はinitialStateで定義して使用する。
- state は書き換えるのではなく新たなオブジェクトとするので、
Object.assignでディープコピーし、それに値を設定し、戻り値とする。
-
containers/Counter、FetchData.jsを作成する。
-
そして、routes.jsを修正してCounter、FetchDataをComponentからContainerに切り替える。
-
ポイント:ここでconnectする。
- Counterは通常通り。
- FetchDataはActionに定義した非同期処理を呼び出す。
- components/Counter、FetchData.jsで、propsのstateとfunctionを参照するように変更する。
- なお、componentWillReceivePropsは無限ループ(stack overflow)防止コードが必要だった。
無事、動作!
- https://github.com/OpenTouryoProject/FrontendTemplates/tree/develop/SPA/React/redux_template
- 上記サンプルは、サーバー・サイドに ASP.NET Core を利用している。
-
BrowserRouterによるページング処理
- Access Route Params in React Router v4 | Jake Trent
https://jaketrent.com/post/access-route-params-react-router-v4/
- Access Route Params in React Router v4 | Jake Trent
-
redux-thunkによる非同期処理
注意:react-reduxを使っているか?いないか?で、サンプル・コードが大きく異なる。- React + ReduxでREST APIを叩いてリスト表示する方法
https://qiita.com/kazmaw/items/a2def8978127ffb11f92
- React + ReduxでREST APIを叩いてリスト表示する方法
移行メモ
- 手順2「実行」で「mapDispatchToPropsで、コレを考慮した設定にする必要があった。」 とあるが、直後のコードは
mapStateToPropsの定義のため 「mapStateToProps」に修正した。- 手順1「Reducer修正」のポイントにあった空の箇条書きを除去した。
- 同名の見出し(「インストール」「デバッグ設定」「実装」「実行」「サンプル」「参考」 「Store作成」「Reducer作成(仮)」「Reduxの組込」「Component作成」「Action作成」 「Reducer修正」「Container作成」「Component修正」「プロジェクトの準備」)が 複数あり GitHub Wiki でアンカが衝突するため、括弧で文脈を補って一意にした。
- マイクロソフト系技術情報 Wiki(techinfoofmicrosofttech.osscons.jp)への URL リンクは、移行済みの ASP.NET Core React+Reduxテンプレート / ASP.NET Core に張り替えた。
- PukiWiki のページ内アンカ(
#xxxxxxxx)は GitHub Wiki では再現できないため、 同一ページ内のアンカは見出しから生成されるアンカに張り替え、 他ページのアンカを指すリンクは「〜(ページ名の該当節を参照)」の形に置き換えた。
Tags: 移行, React, Redux, create-react-app, Store, Reducer, Container, redux-thunk, SPA
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。