React: React入門

Reactは、ユーザーインターフェースを構築するためのJavaScriptライブラリです。ウェブページを家に例えるなら、HTMLはレンガの壁、CSSはインテリアデザイン、JavaScriptは電気や水道設備に相当します。そしてReactはプレハブ式組み立てシステムのようなもので、各部屋(コンポーネント)を個別に設計し、それらを組み合わせて一つの建物として完成させることができます。


1. 学習内容



2. あるフロントエンド開発者の実話

(1) 課題:1ページに30,000行ものjQueryコード

アリスは、中規模のEC企業でフロントエンド開発者として働いています。同社には、3年かけてjQueryを使用して構築された管理用ダッシュボードがあり、そのコード行数は3万行以上に上ります。

▶ サンプル:React入門

JAVASCRIPT
// A typical product list page — jQuery code
function updateProductList(category) {
  // Manual DOM operation
  $('#product-list').empty()
  $('#loading-spinner').show()
  
  $.get('/api/products?category=' + category, function(data) {
    $('#loading-spinner').hide()
    data.forEach(function(product) {
      // Concatenate HTML strings line by line
      var html = '<div class="product-card">' +
        '<h3>' + product.name + '</h3>' +
        '<p>' + product.price + '</p>' +
        '<button onclick="addToCart(' + product.id + ')">Add to Cart</button>' +
        '</div>'
      $('#product-list').append(html)
    })
  })
}

このページの問題点は次のとおりです:

(2) Reactのアプローチ:宣言型+コンポーネントベース

React を使って同じロジックを書き直す:

JSX
function ProductList({ category }) {
  const [products, setProducts] = React.useState([])
  const [loading, setLoading] = React.useState(true)

  React.useEffect(() => {
    fetch('/api/products?category=' + category)
      .then(res => res.json())
      .then(data => {
        setProducts(data)
        setLoading(false)
      })
  }, [category])

  if (loading) return <Spinner />
  
  return (
    <div className="product-grid">
      {products.map(product => (
        <ProductCard key={product.id} product={product} />
      ))}
    </div>
  )
}
▶ 試してみよう

メリット:コードサイズが70%削減され、状態の自動同期が行われ、あるコンポーネントの変更が他のコンポーネントに影響を与えず、パフォーマンスが5倍向上します(仮想DOMのバッチ更新)。



3. Reactの基本概念

(1) 宣言型プログラミングと命令型プログラミング

次元 命令型 (jQuery) 宣言型 (React)
焦点 方法(DOM操作の手順) 結果(最終状態の説明)
コードスタイル ステップバイステップ 説明的な宣言
状態管理 手動による状態設定 + 手動によるDOM更新 状態がUIに自動マッピングされる
デバッグの難易度 すべてのDOM操作を追跡する必要がある 状態の変化を監視するだけでよい
JAVASCRIPT
// Imperative: tell the browser what to do at each step
const div = document.createElement('div')
div.className = 'alert'
div.textContent = 'Hello'
document.body.appendChild(div)

// Declarative: tell React what result you want
function Alert({ message }) {
  return <div className="alert">{message}</div>
}
// React automatically creates and updates the DOM

(2) 仮想DOM

仮想DOMは、Reactのパフォーマンス最適化における中核となる技術です。これは実際のDOMツリーではなく、軽量なJavaScriptオブジェクトツリーです。

100%
graph TB
    A[State changes] --> B[Create a new virtual DOM tree]
    B --> C[Diff A Comparison of Old and New Virtual Environments DOM]
    C --> D[Compute minimum update operations]
    D --> E[Batch update real DOM]
    E --> F[Page update complete]
    
    style A fill:#ff6b6b,color:#fff
    style C fill:#4ecdc4,color:#fff
    style E fill:#45b7d1,color:#fff
概念 リアルDOM バーチャルDOM
エッセンス ネイティブのブラウザオブジェクト 通常のJavaScriptオブジェクト
作成コスト 高(ブラウザのレイアウト処理が必要) 極めて低(純粋なJS操作)
更新方法 直接操作、リフロー/リペイントをトリガー 差分処理後のバッチ更新
更新の粒度 単一操作 バッチ最小更新

(3) コンポーネントベースの開発

Reactの根底にある考え方は、ページを独立した再利用可能なコンポーネントに分解し、各コンポーネントがそれぞれ特定の領域のみを担当するようにすることです。

概念 類推 説明
部品 レゴブロック 各部品は独立した機能単位である
プロパティ ブロックの色・サイズ 親コンポーネントから子コンポーネントに渡されるパラメータ
状態 ブロックの状態(新規/旧) コンポーネント内部で管理されるデータ
パーツツリー 組み立てられたレゴモデル ページを構成するために組み合わされたパーツ
JSX
// Component-based: page broken into independent components
function Page() {
  return (
    <div>
      <Header />        {/* Header navigation */}
      <Sidebar />       {/* Sidebar */}
      <MainContent />   {/* Main content area */}
      <Footer />        {/* Footer copyright */}
    </div>
  )
}
▶ 試してみよう

4. React と他の人気フレームワークの比較

ディメンション React Vue Angular
開発者 Meta(Facebook) You Yuxi(個人) Google
初回リリース 2013 2014 2010
種類 UI ライブラリ プログレッシブ・フレームワーク フル機能型フレームワーク
テンプレートの構文 JSX(JavaScriptに埋め込まれたHTML) HTMLテンプレート + ディレクティブ TypeScript + デコレータ
データフロー 一方向(トップダウン) 双方向バインディング(Vモデル) 双方向バインディング
状態管理 Community Solutions (Redux/Zustand) 公式 Pinia/Vuex 公式 RxJS + Services
習得の難易度 中程度(JSX とフックの理解が必要) 低(テンプレート対応) 高(TypeScript と依存性注入)
SSRソリューション Next.js Nuxt Angular Universal
活用事例 大規模なSPA、モバイルアプリ(React Native) 中小規模のプロジェクト、迅速なプロトタイピング 大規模なエンタープライズアプリケーション
GitHub ⭐ 23万以上 22万以上 10万以上
求人市場(中国) 高い(主に一線都市) 高い(主に中小企業) 中程度(外資系企業・大手IT企業)

まとめ:Reactは、高度な制御性、コンポーネントの高い再利用性、およびクロスプラットフォーム対応(Web+モバイル)が求められるプロジェクトに適しています。Vueは入門しやすく、迅速な反復開発に適しています。Angularは、大規模なエンタープライズレベルのチームに適しています。



5. Reactエコシステムの概要

Reactは「オールインワン」のフレームワークではなく、むしろ柔軟なUIライブラリです。ルーティング、状態管理、ビルドツールなどの機能は、コミュニティのエコシステムに依存して提供されています。

分野 主要ツール 説明
ビルドツール Vite(推奨) / Create React App プロジェクトの骨組み作成と開発用サーバー
ルーティング React Router v6 / TanStack Router ページナビゲーションおよびURL管理
状態管理 状態 / Redux Toolkit / Context API グローバルデータ管理
データ取得 TanStack Query (React Query) / SWR サーバーサイドでのデータキャッシュと同期
スタイリング Tailwind CSS / CSS Modules / styled-components コンポーネントのスタイリング
テスト Vitest + React Testing Library / Playwright ユニットテストおよびE2Eテスト
SSR/SSG Next.js サーバーサイドレンダリングと静的生成
モバイル React Native React を使ったネイティブモバイルアプリの構築
アニメーション フレームモーション / リアクトスプリング UIのアニメーションとトランジション
コンポーネントライブラリ Ant Design / MUI / Shadcn/ui すぐに使えるUIコンポーネント
100%
graph LR
    A[React] --> B[Build: Vite]
    A --> C[Routing: React Router]
    A --> D[Status: Zustand/Redux]
    A --> E[Data: TanStack Query]
    A --> F[Style: Tailwind/CSS Modules]
    A --> G[Test: Vitest + RTL]
    A --> H[SSR: Next.js]
    A --> I[Mobile: React Native]
    
    style A fill:#61dafb,color:#000
    style H fill:#000,color:#fff
    style I fill:#61dafb,color:#000


6. 完全な例:React を使ったシンプルな「いいね」ボタンの作成

JSX
// ============================================
// Example:use  React Build a "Like" Button
// Features:Demonstrating Declarative Programming + Component-based + Core Concepts of State Management
// ============================================

import React from 'react'
import { createRoot } from 'react-dom/client'

// 1. Define a "Like" button component
function LikeButton() {
  // Usage useState Manage Like Status
  const [liked, setLiked] = React.useState(false)
  const [count, setCount] = React.useState(0)

  // Handling Click Events
  function handleClick() {
    if (liked) {
      setLiked(false)
      setCount(count - 1)
    } else {
      setLiked(true)
      setCount(count + 1)
    }
  }

  // Declarative UI:Render different appearances based on state
  return (
    <button
      onClick={handleClick}
      style={{
        padding: '10px 20px',
        fontSize: '16px',
        backgroundColor: liked ? '#ff4757' : '#f1f2f6',
        color: liked ? '#fff' : '#333',
        border: 'none',
        borderRadius: '5px',
        cursor: 'pointer'
      }}
    >
      {liked ? '❤️ Liked' : '🤍 Like'} ({count})
    </button>
  )
}

// 2. Add components to the page
function App() {
  return (
    <div style={{ textAlign: 'center', padding: '50px' }}>
      <h1>React Examples of Likes</h1>
      <p>Click the button to experience declarative programming UI:Just keep an eye on the status,No action required DOM</p>
      <LikeButton />
      <LikeButton /> {/* Component Reusability!*/}
    </div>
  )
}

// 3. Render to page
const root = createRoot(document.getElementById('root'))
root.render(<App />)

この例は何を示しているのでしょうか?

  • 宣言型:「『いいね』の状態が変わったときにボタンがどのように表示されるべきか」を記述するだけで、Reactが自動的にDOMを更新します
  • コンポーネントベースLikeButton は、複数回再利用可能な独立したコンポーネントです
  • 状態管理liked および count は React によって自動的に追跡されるため、手動での DOM 操作は不要です

▶ サンプル:React コンポーネントツリーの可視化

JSX 📖 参照専用
// ============================================
// Example:use  React The component tree displays the page structure
// Features:Simulate the component tree of a blog homepage,Demonstrating a Component-Based Approach
// ============================================

// Leaf Component:Article Card
function ArticleCard({ title, excerpt }) {
  return (
    <div style={{ border: '1px solid #eee', borderRadius: '8px', padding: '12px', marginBottom: '12px' }}>
      <h3 style={{ margin: '0 0 8px 0' }}>{title}</h3>
      <p style={{ color: '#666', margin: 0, fontSize: '14px' }}>{excerpt}</p>
    </div>
  )
}

// Composite Components:List of Articles
function ArticleList({ articles }) {
  return (
    <div>
      <h2>Latest Articles</h2>
      {articles.map(article => (
        <ArticleCard key={article.id} title={article.title} excerpt={article.excerpt} />
      ))}
    </div>
  )
}

// Composite Components:Sidebar
function Sidebar() {
  return (
    <div style={{ backgroundColor: '#fafafa', padding: '16px', borderRadius: '8px' }}>
      <h3>Categories</h3>
      <ul style={{ listStyle: 'none', padding: 0 }}>
        <li>React Tutorial (12)</li>
        <li>TypeScript (8)</li>
        <li>Node.js (5)</li>
      </ul>
    </div>
  )
}

// Root Component:Blog Home
function BlogHome() {
  const articles = [
    { id: 1, title: 'React Getting Started Guide', excerpt: 'Study React Core Concepts and Best Practices...' },
    { id: 2, title: 'Understanding the Virtual DOM', excerpt: 'Virtual DOM How to Improve React Application Performance...' },
    { id: 3, title: 'Component Design Patterns', excerpt: 'Master React Techniques for Combining and Reusing Components...' }
  ]

  return (
    <div style={{ maxWidth: '960px', margin: '0 auto', padding: '20px' }}>
      <header style={{ textAlign: 'center', marginBottom: '24px' }}>
        <h1>📝 My Tech Blog</h1>
        <nav>
          <a href="#" style={{ margin: '0 12px' }}>Home</a>
          <a href="#" style={{ margin: '0 12px' }}>About</a>
          <a href="#" style={{ margin: '0 12px' }}>Contact</a>
        </nav>
      </header>
      <div style={{ display: 'grid', gridTemplateColumns: '2fr 1fr', gap: '24px' }}>
        <ArticleList articles={articles} />
        <Sidebar />
      </div>
      <footer style={{ textAlign: 'center', marginTop: '24px', color: '#999', fontSize: '13px' }}>
        <p>© 2026 web-tutorial.com</p>
      </footer>
    </div>
  )
}

// Component tree Structure:
// BlogHome
// ├── header (Navigation Bar)
// └── div.grid
//     ├── ArticleList
//     │   ├── ArticleCard × 3
//     └── Sidebar
//         └── Category List
論理コード 56 行(40 行制限超過、参照専用)

❓ よくある質問

Q Reactはフレームワークですか、それともライブラリですか?
A Reactは公式には「UIライブラリ」と位置付けられており、本格的なフレームワークではありません。Reactが扱うのは「ビュー層」のみであり、ルーティング、状態管理、HTTPリクエストなどの機能については、コミュニティによって開発されたライブラリの利用が必要となります。この点がReactの柔軟性を高めている要因でもあり、どのツールを組み合わせて使うかは自由に選択できます。
Q Reactを学ぶ前に、何を習得しておく必要がありますか?
A JavaScriptの基礎知識(ES6以上:矢印関数、デストラクチャリング代入、モジュールのインポートとエクスポート、Promises、async/await)が必要です。まだTypeScriptを知らない場合は、まずJavaScriptを学んでからTypeScriptに移行するか、直接TypeScriptを学ぶこともできます(このチュートリアルの第23レッスンでは、ReactとTypeScriptについて詳しく解説します)。また、HTMLとCSSの基本的な知識も必要です。
Q React 18 と React 19、どちらを選ぶべきですか?
A このチュートリアルは React 18.3(現在の LTS 安定版)に基づいています。フェーズ5では、React 19の新機能(use()フック、サーバーコンポーネント、アクションなど)について解説します。本番環境では、React 18から開始し、React 19のエコシステムが成熟してからアップグレードすることをお勧めします。
Q Reactプロジェクトを作成するには、ViteとCreate React App(CRA)のどちらを使うべきですか?
A Viteをお勧めします。CRAは実質的にメンテナンスが終了しており(2023年以降、大きなアップデートはありません)、Viteは起動速度(1秒未満 対 CRAの10~30秒)とビルド速度の両面でCRAをはるかに上回っています。レッスン2からは、コース全体を通じてViteを使用していきます。
Q Reactはもう時代遅れですか?その代わりにNext.jsを学んだほうがいいですか?
A そんなことはありません。Reactは依然として最も人気のあるフロントエンドライブラリであり、GitHubでは23万以上の⭐を獲得し、npmでは毎週4,000万回以上ダウンロードされています。Next.jsはReactを基盤として構築されているため、Reactのコアコンセプト(コンポーネント、フック、状態管理)を理解していない状態でNext.jsを直接学ぶのは非常に困難です。まずはReactの基礎を学び、その後でNext.jsに進むことをお勧めします(このチュートリアルのフェーズ5でこれについて解説します)。

📖 まとめ


📝 練習問題

  1. 基本問題(難易度:⭐):react.dev にアクセスし、ホームページの「Learn React」セクションを見つけて、最初の 3 つのチュートリアルページをざっと目を通し、最も重要だと思う 3 つの概念を書き出してください。
  2. 思考問題(難易度:⭐):「宣言型プログラミング」と「命令型プログラミング」の違いを自分の言葉で説明し、日常生活の例(プログラミングに限らず)を挙げてください。
  3. 比較問題(難易度:⭐⭐):ブログサイトを構築するとしたら、ReactとVueのどちらが適していると思いますか?その選択を裏付ける理由を、少なくとも2つ挙げてください。
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%