UIXHERO

コンポーネント設計|エンジニアリング

UIパーツの責務と分割を定める技術。再利用性と合成可能性が、デザインシステムと実装をつなぐ。

2026年3月22日
更新: 2026年8月27日
6
by Dengen Yosho(DGYS)

この技術でできること

  • のパーツを「実装可能・再利用可能」な単位で設計できる
  • 「似ているが違う」を、バリエーションではなく合成で解決できる
  • エンジニアとコンポーネントのAPI(Props)について議論できる

: カレンダーの中の日付セルを「1つの塊」としてデザインするのではなく、「日付テキスト」「イベントドット」「ステート」の組み合わせとして設計することで、画面サイズが変わっても破綻しない実装が可能になる。


なぜ難しいか

デザイナーとエンジニアで「分割の基準」が違うから。

デザイナーは「見た目のまとまり(レイヤー)」でコンポーネントを分けるが、エンジニアは「データと振る舞いの責務」で分ける。同じUIを見ても頭にある境界線が一致していないため、「デザイン通りに作ると使い回せない」「エンジニアに切り刻まれて見た目の管理が破綻する」といった問題が起きる。


コンポーネント設計のプロセス

責務の分離(単一責任)

どんな場面: 巨大なカードUIやヘッダーをどこで分割するか決める時。

  • UI分割の基準: 「1つの独立した情報を表示しているか」「別のデータを流し込んでも成立するか」で判断する。
  • データの境目: 「ユーザーのプロフィール情報」と「そのユーザーが書いた記事リスト」は、見た目が隣接していても別のコンポーネントに分ける(データ取得タイミングが違うため)。

コンポーネントの合成(Composition)

どんな場面: 似ているが中身が少し違うカードが複数ある時。

  • バリエーションの限界: ArticleCard, ProductCard, UserCard を別々に作るとコードが重複する。
  • 合成アプローチ: <Card> という「枠」のコンポーネントを作り、その中に <CardImage>, <CardBody> をパズルのようにはめ込んで様々なカードを作る。

API(Props)の設計

どんな場面: ボタンの色やサイズなど、外部から変えられる項目を決める時。

  • 意味的命名: color="red"(見た目)ではなく、variant="danger"(意味)でPropsを定義する。
  • デザイントークンとの連動: Propsで指定できる値は、デザインシステムのトークン(Primary, Secondary, Small, Medium等)に限定する。

デザイン時の判断ポイント(Before/After)

パターン: propsの爆発を防ぐ

Before(現実の悪い例): 汎用的なボタンを作ろうとして、Figmaでもコードでもプロパティを増やしすぎる。

<Button 
  bgColor="#FF0000" 
  textColor="#FFF" 
  icon="arrow" 
  iconPosition="right" 
  hasShadow={true} 
  borderRadius="8px"
>

→ 柔軟すぎるため、画面ごとに微妙に違うボタンが作られ、デザインシステムの意味がなくなる。

After(現実的な整理): デザインシステムでバリエーション(種類)として定義し、それ以外は許容しない。

<Button variant="primary" size="large" iconRight="arrow">

→ デザイナーから見ても「この3つのバリエーションから選ぶ」というになり、一貫性が保たれる。

なぜこの制約で運用できるか: 例外的な見た目が必要な場合は、既存コンポーネントを無理に拡張するのではなく、別の一回限りの要素として作るかデザイン自体を見直すというルールにしているため。


アンチパターンと衝突(デザイナー × エンジニア)

❌ 「Figmaのコンポーネント構造=コードの構造」だという思い込み

デザイナーの視点: Figma上で論理的に階層を作った。この通りに実装してほしいし、ツリー構造も揃えてほしい。(品質=完全な同期) エンジニアの視点: Figmaのレイヤー構造は見た目の管理。コードはパフォーマンスやデータ通信ののために構造を変える必要がある。(品質=実行効率と保守性)

なぜ衝突するか(品質の定義差): デザイナーは「管理モデルの同期」を品質と考えるが、エンジニアは「データフローの適切さ」を優先する。

どう合意するか:

  • 1:1で対応させる「UIコンポーネント(ボタン等)」と、対応しない「機能コンポーネント(データ取得等)」があることを理解する。
  • デザイナーは「これはどうデータが入ってくるか」をセットでエンジニアに伝える。

❌ 共通化すべきでないものを共通化する(DRYの誤用)

デザイナーの視点: ログイン画面の入力枠も、検索画面の入力枠も見た目は同じ。共通の <Input> にすべき。(品質=UIの統一) エンジニアの視点: 見た目は同じでも、バリデーションルールや送信時の挙動が全く違う。共通化すると後で破綻する。(品質=変更時の安全性)

なぜ衝突するか(品質の定義差): 「見た目の類似」と「ドメイン(ビジネス上の意味)の類似」を混同している。

どう合意するか:

  • 見た目だけの枠(UI)コンポーネントと、それを使う機能部分を明確に分ける。
  • 「本当に同じ理由で変更が入るか?」を判断基準にする。片方だけ仕様変更されるなら別々に作る。

実践チェックリスト

最低ライン(Must)

[ ] Figmaで定義したProps(バリアント)が、デザインシステムの意味と合致している [ ] 「似ているが別の機能」を持つUIを、無理に1つのコンポーネントにまとめていない [ ] ボタンなど基本要素は、サイズや色を自由に指定させず選択式にしている

理想ライン(Better)

[ ] デザイン段階で「データがどこから来るか」を想定してパーツを分割している [ ] エンジニアと「枠(レイアウト)」と「中身(コンテンツ)」のコンポーネント分割について議論している [ ] 画面ごとに作られた不要な(再利用性のない)コンポーネントを棚卸しする機会がある


関連技術

前提となる技術

セットで使う技術

  • 状態管理 — コンポーネント内のデータ保持

次に学ぶ技術

  • 状態管理 — コンポーネント間でどうデータを渡すか

まとめ

  • この技術の本質: 画面の断片を「再利用可能な責任の単位」として切り出し、組み合わせる技術
  • UXへの影響: 使い回し可能な設計がシステムの一貫性を担保し、ユーザーの迷いをなくす
  • 実務での判断軸: 「ここに変更が入った時、他の画面も一緒に変わっていいか?」
  • 次に学ぶべき技術: 状態管理(細かく分けたコンポーネント間で、どうデータをやり取りするか)

目的別のおすすめ:

更新のお知らせ

サイトに載せていない実例や、新しい記事のお知らせはこちらで出しています。

読んだ内容を、自分の画面に当てるとき

UIXHEROは、記事を書くほかに、画面の検品・判定、デザインシステムの構築、実装と改善の伴走を受けています。何を頼めばいいか決まっていない段階の相談も、同じ窓口で受けます。

UIXHEROに頼めることを見る

※ 記事の内容についての質問や、書いてほしいテーマの要望も同じ窓口で受けています

記事をシェア

メールでお知らせを受け取る

最終更新: 2026年8月27日

この記事を書いた人

Dengen Yosho(DGYS)

Dengen Yosho(DGYS)

UI/UXデザイナー兼デザインエンジニア デザイン歴25年以上 情報設計〜UIデザイン〜React/TypeScriptによる実装までを一気通貫で担当 大手企業のDXプロジェクトや決済アプリ領域で、デザインリードとして改善と構築を経験 現在はフリーランスとして、プロダクトのUI/UX改善とデザインシステム構築を支援 長年の実務の中で感じてきたのは、 「良いUI」はセンスではなく、再現可能な判断の積み重ねであるということ UIXHEROは、 心理学や行動科学の知見を、現場で使える設計言語に翻訳するための場所 関心領域は「ユーザーの行動が変わるUI」 人の認知・注意・意思決定の構造を理解し、 “なぜそのUIが機能するのか”を言語化することを目指している

あわせて読みたい

この記事に関連する記事をご紹介します

API設計|エンジニアリング

デザイン(画面)とデータ(サーバー)をつなぐ契約書。通信の回数と重さが、そのままアプリの体感速度を決定する。

2026年3月22日
6

アーキテクチャパターン|エンジニアリング

システムをどう区分けし、どう繋ぐか。「MVC」や「マイクロフロントエンド」など、開発の地図となる大きな「間取り」の指針。

2026年3月22日
6

SOLID原則|エンジニアリング

「硬直化」を防ぎ、変更に強く壊れにくいシステムを作るための5つの強力な設計原則。

2026年3月22日
6

もっと深く知りたいですか?

ここに掲載されていないトピックについても、リクエストがあれば解説記事を追加します。 わかりにくい点や、具体的な事例について知りたいことがあれば教えてください。

リクエストを送る