Reactコンポーネントの命名規則|読みやすいコードのルール

Reactコンポーネントの適切な命名規則と読みやすいコードを書くためのルールを詳しく解説。チーム開発で統一感のあるコードベースを作るための実践的なガイド

Learning Next 運営
42 分で読めます

「React でコンポーネントを作るとき、どんな名前をつければいいの?」 「チームメンバーが読みやすいコードってどう書くの?」

そんな疑問を持ったことはありませんか? プログラミングでは、コードを書く時間よりも読む時間の方が圧倒的に多いんです。 特に React のようなコンポーネントベースの開発では、適切な命名規則がとても重要になります。

この記事では、React コンポーネントの命名規則と読みやすいコードを書くためのルールを詳しく解説します。 業界標準の慣習から実践的なテクニックまで、具体的な例とともに学んでいきましょう。

大丈夫です! 最初は複雑に感じるかもしれませんが、一つずつ覚えていけば必ず身につきます。

基本的な命名規則を覚えよう

React コンポーネントの命名には、いくつかの重要なルールがあります。 まずは基本的な規則から理解していきましょう。

PascalCase(パスカルケース)を使おう

React コンポーネントは PascalCase で命名するのが決まりです。 PascalCase とは、単語の最初の文字をすべて大文字にする書き方のことです。

// ✅ 正しい命名(PascalCase)
function UserProfile() {
  return <div>ユーザープロフィール</div>;
}

function ShoppingCartItem() {
  return <div>カートアイテム</div>;
}

function NavigationHeader() {
  return <header>ナビゲーション</header>;
}

このように、単語の区切りで大文字にします。 なぜ PascalCase を使うのでしょうか?

React では、コンポーネントと通常の HTML タグを区別するために、大文字で始まる名前をコンポーネントとして認識します。 そのため、PascalCase が必須なんです。

間違った命名例も見てみましょう。

// ❌ 間違った命名
function userProfile() {  // camelCase
  return <div>ユーザープロフィール</div>;
}

function shopping_cart_item() {  // snake_case
  return <div>カートアイテム</div>;
}

function navigation-header() {  // kebab-case
  return <div>ナビゲーション</div>;
}

これらは React では正しく動作しません。 必ず PascalCase で命名しましょう。

意味のある名前を選ぼう

コンポーネントの役割や目的が分かる名前を選ぶことが大切です。

// ✅ 意味が明確な命名
function ProductCard({ product }) {
  return (
    <div className="product-card">
      <h3>{product.name}</h3>
      <p>{product.price}円</p>
    </div>
  );
}

function SearchForm({ onSearch }) {
  return (
    <form onSubmit={onSearch}>
      <input type="text" placeholder="検索..." />
      <button type="submit">検索</button>
    </form>
  );
}

function LoadingSpinner() {
  return <div className="spinner">読み込み中...</div>;
}

これらの名前を見ると、何をするコンポーネントか一目で分かりますね。

逆に、意味が不明確な命名例を見てみましょう。

// ❌ 意味が不明確な命名
function Card({ product }) {  // 何のカードか分からない
  return (
    <div>
      <h3>{product.name}</h3>
      <p>{product.price}円</p>
    </div>
  );
}

function Form({ onSearch }) {  // 何のフォームか分からない
  return (
    <form onSubmit={onSearch}>
      <input type="text" />
      <button>送信</button>
    </form>
  );
}

function Component() {  // 全く意味がない
  return <div>読み込み中...</div>;
}

これらの名前では、何をするコンポーネントか全く分かりません。 必ず具体的で意味のある名前をつけましょう。

ファイル名とコンポーネント名を一致させよう

ファイル名とコンポーネント名は一致させることが重要です。

// ファイル名: UserProfile.jsx
export default function UserProfile() {
  return <div>ユーザープロフィール</div>;
}

// ファイル名: ShoppingCart.jsx
export default function ShoppingCart() {
  return <div>ショッピングカート</div>;
}

// ファイル名: ProductList.jsx
export default function ProductList() {
  return <div>商品一覧</div>;
}

この規則により、ファイルを見つけやすくなり、インポート時も分かりやすくなります。

例えば、UserProfile コンポーネントを使いたい時は、UserProfile.jsx ファイルを探せばいいことが分かります。

目的別の命名パターンを学ぼう

コンポーネントの種類や目的に応じて、決まった命名パターンがあります。 それぞれのパターンを覚えることで、統一感のあるコードが書けるようになります。

UI コンポーネントの命名

再利用可能な UI パーツには、分かりやすい名前をつけましょう。

// ボタン系コンポーネント
function PrimaryButton({ children, onClick }) {
  return (
    <button className="btn-primary" onClick={onClick}>
      {children}
    </button>
  );
}

function SecondaryButton({ children, onClick }) {
  return (
    <button className="btn-secondary" onClick={onClick}>
      {children}
    </button>
  );
}

function IconButton({ icon, onClick, ariaLabel }) {
  return (
    <button className="btn-icon" onClick={onClick} aria-label={ariaLabel}>
      {icon}
    </button>
  );
}

ボタンの種類によって、PrimaryButtonSecondaryButtonIconButton と名前を変えています。 これにより、どんなボタンか一目で分かりますね。

入力系コンポーネントの例も見てみましょう。

// 入力系コンポーネント
function TextInput({ label, value, onChange, error }) {
  return (
    <div className="input-group">
      <label>{label}</label>
      <input 
        type="text" 
        value={value} 
        onChange={onChange}
        className={error ? 'error' : ''}
      />
      {error && <span className="error-message">{error}</span>}
    </div>
  );
}

function SearchInput({ onSearch, placeholder = "検索..." }) {
  return (
    <div className="search-input">
      <input type="text" placeholder={placeholder} />
      <button onClick={onSearch}>検索</button>
    </div>
  );
}

TextInput は一般的なテキスト入力、SearchInput は検索専用の入力と、用途が明確に分かります。

レイアウトコンポーネントの命名

ページの構造を定義するコンポーネントには、Layout という言葉を使うことが多いです。

// レイアウト系コンポーネント
function MainLayout({ children }) {
  return (
    <div className="main-layout">
      <Header />
      <main>{children}</main>
      <Footer />
    </div>
  );
}

function SidebarLayout({ sidebar, children }) {
  return (
    <div className="sidebar-layout">
      <aside className="sidebar">{sidebar}</aside>
      <main className="content">{children}</main>
    </div>
  );
}

function GridContainer({ columns = 3, children }) {
  return (
    <div className={`grid-${columns}`}>
      {children}
    </div>
  );
}

レイアウトの種類によって、MainLayoutSidebarLayoutGridContainer と名前を変えています。

ナビゲーション系のコンポーネントも見てみましょう。

// ナビゲーション系
function NavigationBar({ items }) {
  return (
    <nav className="navbar">
      {items.map(item => (
        <a key={item.id} href={item.url}>
          {item.label}
        </a>
      ))}
    </nav>
  );
}

function BreadcrumbNavigation({ items }) {
  return (
    <nav className="breadcrumb">
      {items.map((item, index) => (
        <span key={index}>
          {index > 0 && <span> > </span>}
          <a href={item.url}>{item.label}</a>
        </span>
      ))}
    </nav>
  );
}

NavigationBar はメインナビゲーション、BreadcrumbNavigation はパンくずリストと、機能が明確に分かります。

ページコンポーネントの命名

特定のページを表すコンポーネントには、PageView をつけることが多いです。

// ページコンポーネント(Page または View suffix)
function HomePage() {
  return (
    <div>
      <WelcomeSection />
      <FeaturedProducts />
      <Newsletter />
    </div>
  );
}

function UserProfilePage() {
  return (
    <div>
      <UserHeader />
      <UserDetails />
      <UserActivity />
    </div>
  );
}

function ProductDetailView({ productId }) {
  return (
    <div>
      <ProductImages />
      <ProductInfo />
      <ProductReviews />
    </div>
  );
}

HomePage はホームページ、UserProfilePage はユーザープロフィールページと、どのページか分かりやすいですね。

ダッシュボード系のコンポーネントも見てみましょう。

// ダッシュボード系
function AdminDashboard() {
  return (
    <div>
      <DashboardHeader />
      <StatisticsCards />
      <RecentActivity />
    </div>
  );
}

function UserDashboard() {
  return (
    <div>
      <WelcomeMessage />
      <QuickActions />
      <RecentOrders />
    </div>
  );
}

AdminDashboard は管理者用、UserDashboard は一般ユーザー用のダッシュボードと、役割が明確です。

機能別コンポーネントの命名

特定の機能を持つコンポーネントには、その機能を表す名前をつけましょう。

// フォーム関連
function LoginForm({ onSubmit }) {
  return (
    <form onSubmit={onSubmit}>
      <TextInput label="メールアドレス" />
      <TextInput label="パスワード" type="password" />
      <PrimaryButton type="submit">ログイン</PrimaryButton>
    </form>
  );
}

function ContactForm({ onSubmit }) {
  return (
    <form onSubmit={onSubmit}>
      <TextInput label="お名前" />
      <TextInput label="メールアドレス" />
      <TextArea label="メッセージ" />
      <PrimaryButton type="submit">送信</PrimaryButton>
    </form>
  );
}

フォームの種類によって、LoginFormContactForm と名前を変えています。

モーダルやダイアログの例も見てみましょう。

// モーダル・ダイアログ
function ConfirmationModal({ isOpen, onConfirm, onCancel, message }) {
  if (!isOpen) return null;
  
  return (
    <div className="modal-overlay">
      <div className="modal">
        <p>{message}</p>
        <div className="modal-actions">
          <SecondaryButton onClick={onCancel}>キャンセル</SecondaryButton>
          <PrimaryButton onClick={onConfirm}>確認</PrimaryButton>
        </div>
      </div>
    </div>
  );
}

function ImageGalleryModal({ images, isOpen, onClose }) {
  return (
    <div className={`gallery-modal ${isOpen ? 'open' : ''}`}>
      <div className="gallery-content">
        {images.map(image => (
          <img key={image.id} src={image.url} alt={image.alt} />
        ))}
      </div>
      <button onClick={onClose}>閉じる</button>
    </div>
  );
}

ConfirmationModal は確認用、ImageGalleryModal は画像ギャラリー用と、用途が明確です。

Props と State の命名規則を理解しよう

コンポーネント内で使用する変数の命名規則も重要です。 Props と State には、それぞれ決まった命名パターンがあります。

Props の命名ルール

Props の命名には、いくつかのルールがあります。

// ✅ 適切な props の命名
function UserCard({ 
  user,              // オブジェクト
  isSelected,        // 真偽値は is, has, can で始める
  onUserClick,       // イベントハンドラは on で始める
  className,         // CSS クラス名
  children           // 子要素
}) {
  return (
    <div 
      className={`user-card ${className} ${isSelected ? 'selected' : ''}`}
      onClick={() => onUserClick(user)}
    >
      <img src={user.avatar} alt={`${user.name}のアバター`} />
      <h3>{user.name}</h3>
      <p>{user.email}</p>
      {children}
    </div>
  );
}

このコードでは、以下のルールを守っています。

  • 真偽値(Boolean): isSelected のように is で始める
  • イベントハンドラ: onUserClick のように on で始める
  • CSS クラス: className という名前を使う
  • 子要素: children という名前を使う

Boolean の命名例をもう少し見てみましょう。

// Boolean の命名例
function Button({ 
  isDisabled,        // 無効状態
  isLoading,         // 読み込み状態
  isPrimary,         // プライマリボタン
  hasIcon,           // アイコンあり
  canSubmit          // 送信可能
}) {
  return (
    <button 
      disabled={isDisabled || isLoading}
      className={`btn ${isPrimary ? 'primary' : 'secondary'}`}
    >
      {isLoading ? 'Loading...' : 'Submit'}
      {hasIcon && <Icon name="arrow" />}
    </button>
  );
}

Boolean の命名には、以下のパターンがあります。

  • is で始める:状態を表す(isSelectedisLoading
  • has で始める:所有を表す(hasIconhasError
  • can で始める:可能性を表す(canSubmitcanEdit

イベントハンドラの命名例も見てみましょう。

// イベントハンドラの命名例
function TodoItem({ 
  todo,
  onToggleComplete,  // 完了状態の切り替え
  onEdit,           // 編集
  onDelete,         // 削除
  onPriorityChange  // 優先度変更
}) {
  return (
    <div className="todo-item">
      <input 
        type="checkbox"
        checked={todo.completed}
        onChange={() => onToggleComplete(todo.id)}
      />
      <span onClick={() => onEdit(todo.id)}>{todo.text}</span>
      <button onClick={() => onDelete(todo.id)}>削除</button>
      <select onChange={(e) => onPriorityChange(todo.id, e.target.value)}>
        <option value="low">低</option>
        <option value="medium">中</option>
        <option value="high">高</option>
      </select>
    </div>
  );
}

イベントハンドラは、すべて on で始めることで、一目でイベント処理だと分かります。

State の命名ルール

State の命名も、分かりやすく統一感のある名前をつけましょう。

// ✅ 適切な state の命名
function ProductSearch() {
  // 基本的な状態
  const [products, setProducts] = useState([]);
  const [searchTerm, setSearchTerm] = useState('');
  const [isLoading, setIsLoading] = useState(false);
  const [error, setError] = useState(null);
  
  // フィルタリング関連
  const [selectedCategory, setSelectedCategory] = useState('all');
  const [sortBy, setSortBy] = useState('name');
  const [sortOrder, setSortOrder] = useState('asc');
  
  // UI状態
  const [isModalOpen, setIsModalOpen] = useState(false);
  const [selectedProduct, setSelectedProduct] = useState(null);
  
  // フォーム状態
  const [formData, setFormData] = useState({
    name: '',
    price: 0,
    category: ''
  });
  
  return (
    <div>
      {/* コンポーネントの実装 */}
    </div>
  );
}

State の命名では、以下のポイントを守っています。

  • Set関数: setProductssetSearchTerm のように set + 状態名
  • Boolean: isLoadingisModalOpen のように is で始める
  • 選択系: selectedCategoryselectedProduct のように selected で始める
  • フォーム: formData のようにまとめて管理

複雑な状態管理の例も見てみましょう。

// 複雑な状態管理の例
function UserManagement() {
  // ユーザーリスト関連
  const [users, setUsers] = useState([]);
  const [filteredUsers, setFilteredUsers] = useState([]);
  const [selectedUsers, setSelectedUsers] = useState([]);
  
  // 検索・フィルタ
  const [searchQuery, setSearchQuery] = useState('');
  const [roleFilter, setRoleFilter] = useState('all');
  const [statusFilter, setStatusFilter] = useState('active');
  
  // ページネーション
  const [currentPage, setCurrentPage] = useState(1);
  const [itemsPerPage, setItemsPerPage] = useState(10);
  const [totalPages, setTotalPages] = useState(0);
  
  // 編集・操作
  const [editingUser, setEditingUser] = useState(null);
  const [isCreateModalOpen, setIsCreateModalOpen] = useState(false);
  const [isDeleteConfirmOpen, setIsDeleteConfirmOpen] = useState(false);
  
  return (
    <div>
      {/* 実装 */}
    </div>
  );
}

この例では、機能ごとに State をグループ化しています。 関連する State をまとめることで、コードの理解しやすさが向上します。

ファイル構造と命名を整理しよう

プロジェクト全体の可読性を高めるためには、ファイル構造も重要です。 適切なディレクトリ構成と命名規則を学びましょう。

推奨ディレクトリ構造

プロジェクトのディレクトリ構造は、以下のように整理することをおすすめします。

src/
├── components/
│   ├── common/              # 共通コンポーネント
│   │   ├── Button/
│   │   │   ├── Button.jsx
│   │   │   ├── Button.test.js
│   │   │   └── Button.module.css
│   │   ├── Input/
│   │   │   ├── Input.jsx
│   │   │   └── Input.module.css
│   │   └── Modal/
│   │       ├── Modal.jsx
│   │       └── Modal.module.css
│   ├── layout/              # レイアウトコンポーネント
│   │   ├── Header/
│   │   ├── Footer/
│   │   └── Sidebar/
│   └── features/            # 機能別コンポーネント
│       ├── auth/
│       │   ├── LoginForm/
│       │   ├── SignupForm/
│       │   └── UserProfile/
│       ├── products/
│       │   ├── ProductCard/
│       │   ├── ProductList/
│       │   └── ProductDetail/
│       └── cart/
│           ├── CartItem/
│           ├── CartSummary/
│           └── CheckoutForm/
├── pages/                   # ページコンポーネント
│   ├── HomePage/
│   ├── ProductsPage/
│   └── UserProfilePage/
└── hooks/                   # カスタムフック
    ├── useAuth.js
    ├── useApi.js
    └── useLocalStorage.js

この構造により、以下のメリットがあります。

  • common: 全体で使い回すコンポーネント
  • layout: ページの骨組みを作るコンポーネント
  • features: 機能ごとに分けたコンポーネント
  • pages: 個別のページコンポーネント
  • hooks: 再利用可能なカスタムフック

インデックスファイルの活用

各ディレクトリに index.js ファイルを作成して、エクスポートを整理しましょう。

// components/common/index.js - エクスポートを整理
export { default as Button } from './Button/Button';
export { default as Input } from './Input/Input';
export { default as Modal } from './Modal/Modal';
export { default as LoadingSpinner } from './LoadingSpinner/LoadingSpinner';

// components/features/products/index.js
export { default as ProductCard } from './ProductCard/ProductCard';
export { default as ProductList } from './ProductList/ProductList';
export { default as ProductDetail } from './ProductDetail/ProductDetail';

この設定により、インポートが簡潔になります。

// 使用する際の import
import { Button, Input, Modal } from '../components/common';
import { ProductCard, ProductList } from '../components/features/products';

長いパスを書く必要がなくなり、コードがすっきりします。

ファイル名の規則

ファイル名にも一貫した規則を適用しましょう。

コンポーネントファイル

  • Button.jsx(React コンポーネント)
  • Button.test.js(テストファイル)
  • Button.module.css(CSS モジュール)

ユーティリティファイル

  • apiClient.js(API クライアント)
  • dateUtils.js(日付ユーティリティ)
  • constants.js(定数)

カスタムフック

  • useAuth.js(認証フック)
  • useApi.js(API フック)
  • useLocalStorage.js(ローカルストレージフック)

この規則により、ファイルの種類が一目で分かります。

コメントとドキュメント

読みやすいコードにするには、適切なコメントも重要です。 どんなコメントを書けばいいか学びましょう。

適切なコメントの書き方

コンポーネントの説明には、JSDoc 形式のコメントを使用しましょう。

/**
 * ユーザープロフィールカードコンポーネント
 * 
 * @param {Object} user - ユーザー情報オブジェクト
 * @param {string} user.id - ユーザーID
 * @param {string} user.name - ユーザー名
 * @param {string} user.email - メールアドレス
 * @param {string} user.avatar - アバター画像URL
 * @param {boolean} isSelected - 選択状態
 * @param {Function} onUserClick - ユーザークリック時のコールバック
 * @param {string} className - 追加のCSSクラス
 */
function UserProfileCard({ 
  user, 
  isSelected = false, 
  onUserClick, 
  className = '' 
}) {
  // プロフィール画像のフォールバック処理
  const avatarUrl = user.avatar || '/images/default-avatar.png';
  
  // 長い名前の場合の短縮表示
  const displayName = user.name.length > 20 
    ? `${user.name.substring(0, 17)}...` 
    : user.name;
  
  return (
    <div 
      className={`profile-card ${className} ${isSelected ? 'selected' : ''}`}
      onClick={() => onUserClick(user)}
      role="button"
      tabIndex={0}
      aria-label={`${user.name}のプロフィール`}
    >
      <img 
        src={avatarUrl} 
        alt={`${user.name}のアバター`}
        onError={(e) => {
          // 画像読み込み失敗時のフォールバック
          e.target.src = '/images/default-avatar.png';
        }}
      />
      <div className="profile-info">
        <h3 title={user.name}>{displayName}</h3>
        <p>{user.email}</p>
      </div>
    </div>
  );
}

このコメントにより、以下のことが分かります。

  • コンポーネントの概要: 何をするコンポーネントか
  • Props の説明: どんなデータを受け取るか
  • 処理の説明: 複雑な処理の目的

PropTypes または TypeScript

型定義を使用することで、コンポーネントの使い方がより明確になります。

// PropTypes を使用した型定義
import PropTypes from 'prop-types';

UserProfileCard.propTypes = {
  user: PropTypes.shape({
    id: PropTypes.string.isRequired,
    name: PropTypes.string.isRequired,
    email: PropTypes.string.isRequired,
    avatar: PropTypes.string
  }).isRequired,
  isSelected: PropTypes.bool,
  onUserClick: PropTypes.func.isRequired,
  className: PropTypes.string
};

UserProfileCard.defaultProps = {
  isSelected: false,
  className: ''
};

TypeScript を使用する場合は、さらに詳細な型定義が可能です。

// TypeScript を使用した場合
interface User {
  id: string;
  name: string;
  email: string;
  avatar?: string;
}

interface UserProfileCardProps {
  user: User;
  isSelected?: boolean;
  onUserClick: (user: User) => void;
  className?: string;
}

const UserProfileCard: React.FC<UserProfileCardProps> = ({
  user,
  isSelected = false,
  onUserClick,
  className = ''
}) => {
  // 実装
};

型定義により、コンポーネントの使い方が明確になり、エラーの発生を防げます。

チーム開発での統一方法

チーム開発では、全員が同じ規則に従うことが重要です。 統一感のあるコードベースを維持する方法を学びましょう。

ESLint と Prettier の設定

ESLint と Prettier を使用して、コーディング規則を自動的に強制できます。

// .eslintrc.json - React の命名規則を強制
{
  "extends": [
    "react-app",
    "react-app/jest"
  ],
  "rules": {
    "react/jsx-pascal-case": "error",
    "react/component-definition-is-missing-display-name": "error",
    "react/prop-types": "warn",
    "camelcase": ["error", { "properties": "never" }],
    "prefer-const": "error",
    "no-var": "error"
  }
}

この設定により、以下のことが自動的にチェックされます。

  • PascalCase: コンポーネント名が PascalCase になっているか
  • camelCase: 変数名が camelCase になっているか
  • PropTypes: Props の型定義があるか

コーディング規約ドキュメント

チーム内でのコーディング規約を文書化しましょう。

# React コンポーネント命名規約

## 基本ルール
1. コンポーネント名は PascalCase
2. ファイル名とコンポーネント名を一致させる
3. Props は camelCase
4. Boolean props は is/has/can で始める
5. Event handlers は on で始める

## 禁止事項
- 汎用的すぎる名前(Component, Item など)
- 略語の多用(Btn, Txt など)
- 数字で始まる名前

## 推奨パターン
- UI コンポーネント: Button, Input, Modal
- ページコンポーネント: HomePage, UserProfilePage
- 機能コンポーネント: LoginForm, ProductCard
- レイアウト: MainLayout, SidebarLayout

この規約を共有することで、チーム全体での統一が図れます。

コードレビューのチェックポイント

コードレビューでは、以下のポイントを確認しましょう。

// コードレビューで確認すべき命名のポイント
const reviewChecklist = {
  コンポーネント名: [
    "PascalCase で命名されているか",
    "役割が明確に表現されているか",
    "ファイル名と一致しているか"
  ],
  Props: [
    "camelCase で命名されているか",
    "Boolean は適切な接頭辞があるか",
    "Event handler は on で始まっているか"
  ],
  変数名: [
    "意味が明確か",
    "適切なスコープで定義されているか",
    "命名規則に従っているか"
  ],
  ファイル構造: [
    "適切なディレクトリに配置されているか",
    "関連ファイルがまとまっているか",
    "import/export が整理されているか"
  ]
};

このチェックリストを使うことで、一貫性のあるコードレビューが可能になります。

自動化ツールの活用

Git フックを使用して、コミット時に自動的にチェックを実行できます。

// package.json
{
  "scripts": {
    "lint": "eslint src/ --ext .js,.jsx",
    "lint:fix": "eslint src/ --ext .js,.jsx --fix",
    "format": "prettier --write src/**/*.{js,jsx}"
  },
  "husky": {
    "hooks": {
      "pre-commit": "npm run lint && npm run format"
    }
  }
}

この設定により、コミット前に自動的にコードが整形され、規則に違反したコードはコミットできなくなります。

まとめ:読みやすいコードを書こう

React コンポーネントの命名規則について、基本から応用まで詳しく解説しました。 学んだ内容を整理して、実際のプロジェクトで活用していきましょう。

今回学んだ重要なポイント

基本的な命名規則

  • コンポーネント名は PascalCase で命名
  • ファイル名とコンポーネント名を一致させる
  • 意味のある具体的な名前を選ぶ

これらの基本ルールを守ることで、コードの可読性が大幅に向上します。

目的別の命名パターン

  • UI コンポーネント: Button, Input, Modal
  • ページコンポーネント: HomePage, UserProfilePage
  • 機能コンポーネント: LoginForm, ProductCard
  • レイアウト: MainLayout, SidebarLayout

パターンを覚えることで、統一感のあるコードが書けるようになります。

Props と State の命名

  • Boolean は is/has/can で始める
  • Event handler は on で始める
  • State の Set 関数は set + 状態名

これらの規則により、コンポーネントの使い方が明確になります。

チーム開発での統一

  • ESLint と Prettier での自動チェック
  • コーディング規約の文書化
  • コードレビューでのチェックポイント

統一されたルールにより、チーム全体での開発効率が向上します。

実践で活用するためのステップ

1. 基本ルールを覚える

  • PascalCase でのコンポーネント命名
  • 意味のある名前の選択
  • ファイル名との一致

2. パターンを身につける

  • 目的別の命名パターンを練習
  • 実際のプロジェクトで試してみる
  • 一貫性を保つ意識を持つ

3. チーム規則を作る

  • コーディング規約を文書化
  • 自動チェックツールの導入
  • コードレビューでの確認

4. 継続的な改善

  • 定期的な規則の見直し
  • 新しいパターンの追加
  • チームメンバーとの情報共有

最後に

適切な命名規則を守ることで、コードの可読性が向上し、チーム開発がスムーズになります。 最初は覚えることが多く感じるかもしれませんが、慣れてくると自然に書けるようになります。

この記事で学んだルールを参考に、読みやすく保守しやすい React コードを書いてみてください。 統一された命名規則により、将来の自分やチームメンバーが感謝するはずです。

ぜひ今日から実践してみてくださいね!

関連記事