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

意見交換

1回答

182閲覧

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

kmr_kiko

総合スコア112

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-D-Xebec👍を押しています

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

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

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

回答1

#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で受け取ります

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

関連した質問