Layoutコンポーネント
#コンポーネントツリー #宣言的UIの設計レシピ #React
Dan Abramov
@dan_abramov: top react skill to learn in 2023
何
コンポーネントの配置のみに責務を持つコンポーネント
この呼び方は正式名称ではなくkoushisa.iconが概念化するために勝手にそう呼び始めた
propsバケツリレーによる密結合を防ぐ
Container/Presenterパターンの派生版
追記: 2023/08/16
koushisa.iconとほぼ同じ思想の記事
コンポーネントベースで開発する時の CSS の書き方とコンポーネントの分類 (自己流)
コンポーネントの分類
ロジックコンポーネント
レイアウトコンポーネント
ブロックコンポーネント
インラインコンポーネント
~
ルート以外のレイアウトコンポーネントは基本的に width: 100%, height: 100%; margin: 0; padding: 0; box-sizing: border-box; で display: grid or display: flex。 grid 推奨
/tosuke/Layout Component
実装イメージ
RootがLayoutコンポーネントを配置するとして、
https://scrapbox.io/files/63ead3f477f76b001c901b51.png
LayoutコンポーネントはReactNodeを活用する
親は子の詳細を意識しないし、子も親の詳細を意識しない
ステレオタイプ > コントロール的な役割
Layoutコンポーネントはコンポーネント結合の橋渡し役になる
<UserList users={users} Item={(user) => <UserItem user={user}/>} />
同じステートを共有するが、空間や関心が別のコンポーネントを疎結合に作れる
各コンポーネントのpropsの構造を作成する責務はLayoutの親
propsバケツリレーを程度解決できる
たとえば孫コンポーネントへのprops指定も、Layoutへ委譲できる
コンポーネントの共通結合を外部結合に引き上げる的な役割も担える
関心事の分離
コンポーネントの配置とレイアウト及びスタイリングの分離
HTML, CSS, GridなどをLayoutコンポーネントの中に閉じ込める
Tailwindの黒魔術もある程度閉じ込められる
殆どのコンポーネントが参照透過性を持つようになるので、Storybookとかテスト容易性的にもメリットがある
関数型プログラミングっぽい感じにできる
Pipeline Operatorのように中間状態を排除して状態伝播したりとか
local reasoningしたりとか
副作用は最初と最後に寄せるを実現できるのが嬉しい
The State Initializer PatternやLifting state upと組み合わせると綺麗なコンポーネントツリーを作りやすい
React Docsでも似たような説明があった気がする
React > Context#641a84978660300000748f33
Advanced React component composition
---
コンポーネントを疎結合にする目的であればNavigation Stateを経由するという手もある
URL state is underrated
App Routerでは、React Server Componentsのクライアントサイドの状態管理にcookieやurlが使える
ちなみに、この責務をサーバー側に移したのがServer-Driven UI
概念スキーマを外部スキーマに変換する層