React: React入門
Reactは、ユーザーインターフェースを構築するためのJavaScriptライブラリです。ウェブページを家に例えるなら、HTMLはレンガの壁、CSSはインテリアデザイン、JavaScriptは電気や水道設備に相当します。そしてReactはプレハブ式組み立てシステムのようなもので、各部屋(コンポーネント)を個別に設計し、それらを組み合わせて一つの建物として完成させることができます。
1. 学習内容
- Reactとは何ですか?また、なぜReactが必要なのでしょうか?
- 宣言型プログラミングと命令型プログラミング
- 仮想DOMの仕組み
- React 対 Vue 対 Angular
- Reactエコシステムの概要
2. あるフロントエンド開発者の実話
(1) 課題:1ページに30,000行ものjQueryコード
アリスは、中規模のEC企業でフロントエンド開発者として働いています。同社には、3年かけてjQueryを使用して構築された管理用ダッシュボードがあり、そのコード行数は3万行以上に上ります。
▶ サンプル:React入門
// 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)
})
})
}
このページの問題点は次のとおりです:
- 状態とDOMの同期が取れていない:ショッピングカートの合計金額が変わった場合、ページ上の他の3か所の数値を手動で更新する必要があります。
- 保守性の低さ:1つの機能を変更するために、5つのファイルの変更が必要になる場合がある
- パフォーマンスの問題:各更新処理が実際のDOMを直接操作するため、ページ上で頻繁にリフローやリペイントが発生する
(2) Reactのアプローチ:宣言型+コンポーネントベース
React を使って同じロジックを書き直す:
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操作を追跡する必要がある | 状態の変化を監視するだけでよい |
// 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オブジェクトツリーです。
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の根底にある考え方は、ページを独立した再利用可能なコンポーネントに分解し、各コンポーネントがそれぞれ特定の領域のみを担当するようにすることです。
| 概念 | 類推 | 説明 |
|---|---|---|
| 部品 | レゴブロック | 各部品は独立した機能単位である |
| プロパティ | ブロックの色・サイズ | 親コンポーネントから子コンポーネントに渡されるパラメータ |
| 状態 | ブロックの状態(新規/旧) | コンポーネント内部で管理されるデータ |
| パーツツリー | 組み立てられたレゴモデル | ページを構成するために組み合わされたパーツ |
// 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(個人) | |
| 初回リリース | 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コンポーネント |
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 を使ったシンプルな「いいね」ボタンの作成
// ============================================
// 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 コンポーネントツリーの可視化
// ============================================
// 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
❓ よくある質問
use()フック、サーバーコンポーネント、アクションなど)について解説します。本番環境では、React 18から開始し、React 19のエコシステムが成熟してからアップグレードすることをお勧めします。📖 まとめ
- React は 宣言型プログラミング を採用した UI ライブラリです。ユーザーが望む結果を記述すれば、React が DOM の更新を処理してくれます
- 仮想DOMはReactのパフォーマンスの中核をなしています。これは、JavaScriptオブジェクトのツリーを比較し、実際のDOMをバッチ処理で更新する仕組みです。
- コンポーネントベースのアーキテクチャは、Reactの最も基本的な設計原則です。各コンポーネントは独立しており、再利用可能で、自身のロジックのみを担当します。
- Reactは、大規模なSPAやクロスプラットフォーム開発に適しており、学習曲線は中程度です(JavaScriptの基礎知識が必要です)。
- Reactのエコシステムは充実しているものの、制約は少なく、ルーティング、ステート管理、ビルドツールは自由に選択できます。
📝 練習問題
- 基本問題(難易度:⭐):react.dev にアクセスし、ホームページの「Learn React」セクションを見つけて、最初の 3 つのチュートリアルページをざっと目を通し、最も重要だと思う 3 つの概念を書き出してください。
- 思考問題(難易度:⭐):「宣言型プログラミング」と「命令型プログラミング」の違いを自分の言葉で説明し、日常生活の例(プログラミングに限らず)を挙げてください。
- 比較問題(難易度:⭐⭐):ブログサイトを構築するとしたら、ReactとVueのどちらが適していると思いますか?その選択を裏付ける理由を、少なくとも2つ挙げてください。