質問するログイン新規登録

意見交換

3回答

345閲覧

Reactコンポーネント設計:スタイルをclassNameで渡すか、propsで渡すかの判断基準について

kmr_kiko

総合スコア119

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

フロントエンド

フロントエンドは、Webのユーザーインターフェースに関する技術全般を扱います。HTML/CSS/JavaScriptや、React・Vue.jsといったモダンフレームワークの話題に使われます。

1グッド

0クリップ

投稿2025/12/12 11:59

1

0

聞きたいこと

Reactでコンポーネントを設計する際、スタイルの受け渡し方法についてみなさんがどのような判断基準を持っているか、ご意見をお聞かせいただきたいです。
具体的には以下の2点についてです。

  1. スタイルをclassNameで渡すか、専用のprops(例:size, variantなど)で渡すかの判断
  2. そもそもclassNameを外部から受け渡せるようにするかどうかの判断

背景

コンポーネントを作成する際、スタイルのカスタマイズ性をどこまで許容するかで迷うことがあります。

TypeScript

1// パターンA: classNameで渡す 2<Button className="my-custom-style" /> 3 4// パターンB: propsで渡す 5<Button size="large" variant="primary" /> 6 7// パターンC: classNameを受け付けない(内部で完結) 8<Button /> // 外部からのスタイル上書き不可

classNameを許容すると柔軟性は上がりますが、意図しないスタイルの上書きが起きたり、コンポーネントの一貫性が損なわれるリスクもあると感じています。
一方で、propsのみだと想定外のカスタマイズ要件に対応できないこともあり...。

お聞きしたいこと

  • みなさんはどのような基準で判断されていますか?
  • チームや個人で運用ルールを決めていますか?
  • 「この場合はclassName、この場合はprops」のような具体的な使い分け例があれば教えていただけると嬉しいです

正解を求めているというよりは、いろいろな考え方を知りたいと思っています。
お気軽にご意見いただければ幸いです。

Rocks👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

回答3

#1

ymmr

総合スコア64

投稿2025/12/13 11:23

編集2025/12/13 11:41

スタイルをclassNameで渡すか、専用のprops(例:size, variantなど)で渡すかの判断

props(variant/size…)を優先するケースとしては、デザインシステムで定義された「意味のあるバリエーション」 を提供したいときです。
具体的には以下のケースです。

  • variant="primary" | "secondary" みたいに、見た目がデザイン上のルールと直結している
  • size="sm" | "md" | "lg" が、余白・高さ・フォントなど複数のスタイル束を一貫して切り替える
  • デザイナー/PdMとの会話でも「primaryのボタン」みたいに言葉で通じる

こういう場合、classNameで自由にされると、 “primaryなのに角丸が違う” といったことが起きるため、propsを優先する場合が多いです。

classNameを使用するケースとしては、「レイアウト調整」 場合です。
具体的には以下のようなケースです。

  • margin, width, flex, grid など 親レイアウト文脈の調整
  • “見た目の種類”ではなく、周辺の配置をいじりたいだけ

ここをpropsで全部受けると mt, mb, w, px みたいなprops地獄になりやすいため、「レイアウトはclassNameで逃がす」 が現実的かと
また、margin/paddingなどコンポーネントの外側調整は親の責務でclassNameで受け取ります

#2

tt-tt

総合スコア216

投稿2025/12/23 11:24

自分はclassNameでスタイリングしたくない派です。
なので、propsで設定するです。
メリットとしては

  • styleの責務をそのコンポーネントで閉じれる(classNameだと親が責務をもってしまう)
  • 「propsで賄えないとき = 別componentとする」みたいな判断軸ができる
  • デザイナーとデザインの揺れについて会話がしやすい

逆にcomponentで賄えきれない、余白や幅などはcomponentの責務から逃してます。
それはレイアウトに依存する部分だと思うので、親の責務(別componentやcomposition的考え方)にしています。
(親が決めたwidthで広がる感じです)
なので、他の人が回答しているmt, mb, w, pxみたいなのは逆にcomponentに持たせないにしてます!

自分なりの現状の結論は、最初に述べたように、classNameは受け取らず、component内でstyleを指定し、必要なパターンはpropsで指定
propsが多くなったり、「ここまで来たら別のcomponentやん」ってなったら分離するです!

#3

satoshih

総合スコア880

投稿2025/12/24 10:08

1. スタイルをclassNameで渡すか、専用のprops(例:size, variantなど)で渡すかの判断

propsで受け取る はコンポーネントごとにpropsの値をもとにスタイルを決定するロジックが生まれるのでメンテナンス性が低くなります。
なので classNameで管理すべき かと思います。

各コンポーネントのスタイルは WEBページ というスコープで責務を持って統一的なデザインを目指すべきです

2. そもそもclassNameを外部から受け渡せるようにするかどうかの判断

classNameを受け渡せないようにする は無しです。拡張性が低くなりすぎます。
コンポーネントを作成する際に、多くの場合既存のコンポーネントをwrapして作成しますがその際に困ることになるので、無闇に機能を限定(制限)しない方がいいです。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

この意見交換はまだ受付中です。

会員登録して回答してみよう

アカウントをお持ちの方は

関連した質問