-
Notifications
You must be signed in to change notification settings - Fork 0
DNET_React4thStep
- 戻る(React -> Redux)
- Reactのファースト・ステップ
- Reactのセカンド・ステップ
- Reactのサード・ステップ
- Reactの4thステップ
- Reactの5thステップ
- ...Reactのファースト・ステップ2
4thステップ では、サード・ステップで開発した
CRUDサンプルのコンポーネント分割に取り組む。
下記コンポーネントのフォルダは分けても分けなくてもイイ。
- Presentational Component(React の「Component と Container」の該当節を参照)
- Container Component(React の「Component と Container」の該当節を参照)
ただ、ココのサンプルでは、
- components
- containers
にフォルダを分ける。
-
初めはPresentational Componentだけを使用する。
-
規模増加に伴い、段階的に、Container Componentを導入する。
-
多数のRenderXXX
-
コンポーネント分割中毒
-
propの展開し過ぎ
Reactのサード・ステップの「手順1」のComponent分割を行う。
-
データおよびイベント連携(React の該当節を参照)により実現する。
-
子から親:
- → 親のハンドラをthis.propsで子に渡し、
- → 子からハンドラを呼び出す(引数指定可能)。
- → setState
-
親から子:
- → props(JSX Spread Attributes)にバインド
- → 子に定義したcomponentWillReceivePropsから
- → setStateメソッドを呼び出す。
-
-
Component分割のサンプルとしては、Reactのファースト・ステップの「手順2」が参考になる。
-
Component分割によって、再利用が可能になったり、見通しが良くなる。
-
Reduxのように安易にグローバル化できないので、
「何の状態を、どのComponentにどの方向で連携するか?」
を事前によく検討して設計する必要がある。 -
方向を意識した変更通知の実装が必要になるので、実装難易度は上がる。
-
ルートのComponentは、
- 子Componentと
- データを流す方向を
検討する。
-
Reactでは、以下の様な設計書を起こすのが寛容か?

子のComponentは以下の様に分割する。
-
DDL
入力となるDropDownList -
Input
入力となる<INPUT type="text"> -
Output
出力となる- Paragraphタグ
- Tableタグ
<INPUT type="text">
-
Button
イベントハンドラ
1画面
-
1ルートContainer
-
複数の子
- Container
- Component
みたいな。
※ Reduxと違って、イベントハンドラは分散する。
2020年4月、開示予定
Reactのサード・ステップの「手順2」のComponent分割を行う。
-
Containerから複数のComponentを呼び出すようなComponent分割も可能。
-
Containerの分割(Container in Container)も可能らしいので、
ここでは、Containerを分割して、対応するComponentも分割する。
例えば、
-
Containerで2つのComponent、ComponentAとComponentBを表示する場合...、
- Componentが増えていくとその分、必要なハンドラやプロパティが増える。
- mapStateToProps と mapDispatchToProps が肥大化してしまい見通しが悪くなる。
-
しかし、全Componentを Containerにするとやり過ぎになるので適切な単位で分割する。
- データフェッチしていた箇所だけを元のContainerに残す。
- ComponentA、B に関するプロパティとハンドラをそれぞれ ContainerA、B に分割する。
など。
ルートのContainerには、
- mapStateToProps, mapDispatchToPropsを定義せず、
- ComponentにConnectしない(Renderが動かなくなる)。
- DOMのRenderを実装する。
-
手順1の「子のComponent」と同様に分割する。
-
技術的に、
子のContainerには、- mapStateToProps, mapDispatchToPropsを定義し、
- ComponentにConnectする。
- DOMのRenderを実装しない。
- Component側にDOMのRenderを実装する。
1画面
-
1ルートContainer
-
複数の子
- Container
- Component
-
1Action
-
1Reducer
みたいな。
-
2020年4月、開示予定
-
Component分割によって、一部、Stateで運用していた所も、
mapStateToPropsメソッドを使用してProps化し、
Component間で状態の共有も容易に書くことが出来た。
React の「Component と Container」の該当節を参照。
-
私のReactのコンポーネント実装アンチパターン
https://qiita.com/seya/items/7a0d20da4de5fab14426 -
メンテナブルな React Component を目指すための小技集
https://qiita.com/terrierscript/items/372727448b58d4738018
-
React Component 視点での
アトミックデザインの解釈といくつかの疑問
https://mizchi.hatenablog.com/entry/2018/06/07/203739 -
Redux 再考
https://mizchi.hatenablog.com/entry/2018/10/04/101308
移行メモ
- 「mapStateToProps, mapDispatchToPropsを定義ぜず、」→「定義せず、」に修正した。
- 元 Wiki では「手順1」と「手順2」の見出しに同じアンカ(
#l1074ab3)が 振られており、「子のContainer」からの「手順1」参照は実際には 「子のComponent」を指していたため、そちらへのリンクとした。- 同名の見出し(「前提」「トレードオフ」「方針」「モジュール化」 「サンプルの実装」「Component と Container」)が複数あり GitHub Wiki でアンカが衝突するため、括弧で文脈を補って一意にした。
- PukiWiki のページ内アンカ(
#xxxxxxxx)は GitHub Wiki では再現できないため、 同一ページ内のアンカは見出しから生成されるアンカに張り替え、 他ページのアンカを指すリンクは「〜(ページ名の該当節を参照)」の形に置き換えた。
Tags: 移行, React, Redux, 4thステップ, コンポーネント分割, Presentational Component, Container Component
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。