「[[.NET 開発基盤部会 Wiki>http://dotnetdevelopmentinfrastructure.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-戻る
--[[React]] -> [[Redux]]
--[[Reactのファースト・ステップ]]
--[[Reactのセカンド・ステップ]]
--[[Reactのサード・ステップ]]
--Reactの4thステップ
--[[Reactの5thステップ]]

*目次 [#bd2236cc]
#contents

*概要 [#a184b9fb]
4thステップ では、[[サード・ステップ>Reactのサード・ステップ]]で開発した~
CRUDサンプルの[[コンポーネント分割>#q259873b]]に取り組む。

*コンポーネント分割 [#q259873b]

**フォルダ [#b3cb028e]
下記コンポーネントのフォルダは分けても分けなくてもイイ。

-[[Presentational Component>React#i7081aae]]
-[[Container Component>React#x2578f6f]]

ただ、ココのサンプルでは、

-components
-containers

にフォルダを分ける。

**タイミング [#pdcec503]
-初めは[[Presentational Component>React#i7081aae]]だけを使用する。

-規模増加に伴い、段階的に、[[Container Component>React#x2578f6f]]を導入する。

**アンチパターン [#o995cd17]

-多数のRenderXXX

-コンポーネント分割中毒

-propの展開し過ぎ

*手順1 [#l1074ab3]
[[Reactのサード・ステップの手順1>Reactのサード・ステップ#i946770b]]のComponent分割を行う。

**前提 [#vc58d950]
-[[データおよびイベント連携>React#n8b8bac0]]により実現する。

--子から親:
---→親のハンドラをthis.propsで子に渡し、
---→子からハンドラを呼び出す(引数指定可能)。
---→setState

--親から子:
---→props(JSX Spread Attributes)にバインド
---→子に定義したcomponentWillReceivePropsから
---→setStateメソッドを呼び出す。

-Component分割のサンプルとしては、[[コチラ>Reactのファースト・ステップ#n908d0bb]]が参考になる。

**トレードオフ [#q46383fd]
-Component分割によって、再利用が可能になったり、見通しが良くなる。

-[[Redux]]のように安易にグローバル化できないので、~
「何の状態を、どのComponentにどの方向で連携するか?」~
を事前によく検討して設計する必要がある。

-方向を意識した変更通知の実装が必要になるので、実装難易度は上がる。

**方針 [#i1632b3b]

***ルートのComponent [#ue93a57d]
-ルートのComponentは、

--[[子Component>#ge900513]]と
--データを流す方向を

>検討する。

-Reactでは、以下の様な設計書を起こすのが寛容か?
#ref(無題.png,left,nowrap,概要図,50%)

***子のComponent [#ge900513]
子のComponentは以下の様に分割する。

-DDL~
入力となるDropDownList

-Input~
入力となる<INPUT type="text">

-Output~
出力となる
--Paragraphタグ
--Tableタグ
--<INPUT type="text">

-Button~
イベントハンドラ

***モジュール化 [#pd6dba31]
1画面

-1ルートContainer

-複数の子
--Container
--Component

みたいな。

※ [[Redux]]と違って、イベントハンドラは分散する。

**サンプルの実装 [#i8f8b8cc]
2020年4月、開示予定

*手順2 [#l1074ab3]
[[Reactのサード・ステップの手順2>Reactのサード・ステップ#j40c0c29]]のComponent分割を行う。

**前提 [#u8056ca5]
-Containerから複数のComponentを呼び出すようなComponent分割も可能。

-Containerの分割(Container in Container)も可能らしいので、~
ここでは、Containerを分割して、対応するComponentも分割する。

**トレードオフ [#ka17c2b5]
例えば、

-Containerで2つのComponent、ComponentAとComponentBを表示する場合...、
--Componentが増えていくとその分、必要なハンドラやプロパティが増える。
--mapStateToProps と mapDispatchToProps が肥大化してしまい見通しが悪くなる。

-しかし、全Componentを Containerにするとやり過ぎになるので適切な単位で分割する。
--データフェッチしていた箇所だけを元のContainerに残す。
--ComponentA、B に関するプロパティとハンドラをそれぞれ ContainerA、B に分割する。

など。

**方針 [#ve1ccbd3]

***ルートのContainer [#v5fba64e]
ルートのContainerには、
-mapStateToProps, mapDispatchToPropsを定義ぜず、
-ComponentにConnectしない(Renderが動かなくなる)。
-DOMのRenderを実装する。

***子のContainer [#va48feb0]
-[[手順1>#ge900513]]と同様に分割する。

-技術的に、~
子のContainerには、
--mapStateToProps, mapDispatchToPropsを定義し、
--ComponentにConnectする。
--DOMのRenderを実装しない。
--Component側にDOMのRenderを実装する。

***モジュール化 [#w7eb726d]
1画面

-1ルートContainer

-複数の子
--Container
--Component

-1Action
-1Reducer

みたいな。

**サンプルの実装 [#j638929e]
-2020年4月、開示予定

-Component分割によって、一部、Stateで運用していた所も、~
mapStateToPropsメソッドを使用してProps化し、~
Component間で状態の共有も容易に書くことが出来た。

*参考 [#o7a18067]

**[[Component と Container>React#m78a648c]] [#a34fc2d8]

**Qiita [#t7dcac5f]
-[[React/Redux約三年間書き続けたので知見を共有します | Enigmo Life>http://www.enigmo.co.jp/blog/tech/reactredux%E7%B4%84%E4%B8%89%E5%B9%B4%E9%96%93%E6%9B%B8%E3%81%8D%E7%B6%9A%E3%81%91%E3%81%9F%E3%81%AE%E3%81%A7%E7%9F%A5%E8%A6%8B%E3%82%92%E5%85%B1%E6%9C%89%E3%81%97%E3%81%BE%E3%81%99/]]~

-私のReactのコンポーネント実装アンチパターン~
https://qiita.com/seya/items/7a0d20da4de5fab14426

-メンテナブルな React Component を目指すための小技集~
https://qiita.com/terrierscript/items/372727448b58d4738018

**mizchi's blog [#q28e1f0c]

-React Component 視点での~
アトミックデザインの解釈といくつかの疑問~
https://mizchi.hatenablog.com/entry/2018/06/07/203739

-Redux 再考~
https://mizchi.hatenablog.com/entry/2018/10/04/101308

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS