React開発者を目指す皆さん、ようこそ!素晴らしい選択をしましたね。Reactは、ユーザーインターフェース構築のための強力で人気のあるJavaScriptライブラリであり、これを学ぶことはウェブ開発スキルを向上させる確実な方法です。この包括的なステップバイステップガイドは、あなたがゼロからヒーローになるまでをサポートし、2025年に独自のReactアプリケーションを構築し始めるために必要な実践的な知識を身につけさせます。読むだけでなく、実践することに焦点を当てますので、コードを書く準備をしてください!
最大限の生産性で開発チームが協力するための統合されたオールインワンプラットフォームが必要ですか?
Apidogはあなたのすべての要求に応え、Postmanをはるかに手頃な価格で置き換えます!
React開発環境をセットアップしましょう
素晴らしいユーザーインターフェースの構築を始める前に、作業場所をセットアップする必要があります。これは、新しいプロジェクトを始める前に作業場を準備するようなものだと考えてください。
必須要素のインストール:Node.jsとnpm
Reactアプリケーションは、Node.jsとそのパッケージマネージャーであるnpm(Node Package Manager)を使用して構築および管理されます。
- Node.js: これは、Webブラウザの外でJavaScriptコードを実行できるJavaScriptランタイムです。
- npm: これは、プロジェクトに簡単にインストールして使用できるソフトウェアパッケージの巨大なレジストリです。
始めるには、公式のNode.jsウェブサイトにアクセスし、最新の長期サポート(LTS)バージョンをダウンロードしてください。インストーラーは簡単です。画面の指示に従ってください。インストールが完了すると、Node.jsとnpmの両方がすぐに使用できるようになります。インストールを確認するには、ターミナルまたはコマンドプロンプトを開いて次のように入力します:Bash
node -v
npm -v
これらのコマンドは、それぞれインストールされているNode.jsとnpmのバージョンを表示するはずです。
Viteで初めてのReactプロジェクト
以前は、新しいReactプロジェクトを開始するための定番ツールはcreate-react-app
でした。しかし、現代のWeb開発の状況は急速に変化しており、2025年では、その驚異的な速度と効率性からViteが推奨される選択肢となっています。
Viteで新しいReactプロジェクトを作成するには、ターミナルを開いて次のコマンドを実行します:Bash
npm create vite@latest my-first-react-app -- --template react
このコマンドを分解してみましょう:
npm create vite@latest
: このコマンドはnpmを使用してcreate-vite
パッケージの最新バージョンを実行します。my-first-react-app
: これはプロジェクトフォルダの名前です。好きな名前に変更できます。-- --template react
: これは、Reactテンプレートを使用してプロジェクトを作成することをViteに伝えます。
コマンドが完了すると、プロジェクト名と同じ新しいディレクトリが作成されます。このディレクトリに移動します:Bash
cd my-first-react-app
次に、プロジェクトの依存関係をインストールする必要があります。これらは、Reactアプリケーションが正しく機能するために必要な他のパッケージです。次のコマンドを実行します:Bash
npm install
最後に、真新しいReactアプリケーションを実際に見てみるために、開発サーバーを起動します:Bash
npm run dev
ターミナルにはローカルURL、通常はhttp://localhost:5173
が表示されます。このURLをWebブラウザで開き、Viteによって作成されたデフォルトのReactアプリケーションが表示されるはずです。おめでとうございます、初めてのReactプロジェクトのセットアップが完了しました!
Reactの心臓部:コンポーネントとJSX
Reactアプリケーションが実行できるようになったので、Reactを非常に強力にしている核となる概念、すなわちコンポーネントとJSXについて掘り下げてみましょう。
コンポーネントとは?
その核となる部分で、Reactアプリケーションは、コンポーネントと呼ばれる再利用可能で自己完結型のUIの集合体です。ウェブページをLEGOブロックで構築されていると考えてください。各ブロックがコンポーネントであり、それらを組み合わせてより複雑な構造を作成できます。
my-first-react-app
プロジェクトで、src
フォルダを開くと、App.jsx
という名前のファイルが見つかります。これがメインのアプリケーションコンポーネントです。基本を理解するためにその内容を単純化してみましょう:JavaScript
// src/App.jsx
function App() {
return (
<div>
<h1>Hello, React World!</h1>
<p>This is my very first React component.</p>
</div>
);
}
export default App;
このコードでは:
App
というJavaScript関数を定義しています。これは関数コンポーネントであり、Reactでコンポーネントを作成するモダンで推奨される方法です。- この関数は、HTMLのように見えるものを
return
しています。これがJSXです。 - 最後に、アプリケーションの他の部分がこのコンポーネントを使用できるように、
export default App
しています。
JSXの理解:JavaScript XML
JSXは、JavaScriptファイル内に1HTMLのようなコードを記述できるようにするJavaScriptの構文拡張です。実際にはHTMLではありませんが、UIコードの記述をはるかに直感的で読みやすくします。
舞台裏では、トランスパイラと呼ばれるツール(この場合はViteが提供)が、このJSXをブラウザが理解できる通常のJavaScriptに変換します。
JSXの力を確認するために、App.jsx
を修正してみましょう。波括弧{}
を使用することで、JavaScript式をJSX内に直接埋め込むことができます。JavaScript
// src/App.jsx
function App() {
const name = "Beginner Developer";
const year = new Date().getFullYear();
return (
<div>
<h1>Hello, {name}!</h1>
<p>Welcome to your React journey in {year}.</p>
</div>
);
}
export default App;
ファイルを保存すると、ブラウザが自動的に更新されて新しいコンテンツが表示されます。これはViteのHot Module Replacement(HMR)と呼ばれる機能であり、素晴らしい開発体験を提供します。
初めてのカスタムコンポーネントの作成
独自のコンポーネントを作成してみましょう。src
フォルダに、Greeting.jsx
という名前の新しいファイルを作成します。JavaScript
// src/Greeting.jsx
function Greeting() {
return (
<h2>This is a greeting from my custom component!</h2>
);
}
export default Greeting;
次に、この新しいGreeting
コンポーネントをApp.jsx
コンポーネント内で使用してみましょう。JavaScript
// src/App.jsx
import Greeting from './Greeting'; // Greetingコンポーネントをインポート
function App() {
const name = "Beginner Developer";
const year = new Date().getFullYear();
return (
<div>
<h1>Hello, {name}!</h1>
<p>Welcome to your React journey in {year}.</p>
<Greeting /> {/* Greetingコンポーネントを使用 */}
</div>
);
}
export default App;
通常のHTMLタグのようにインポートして<Greeting />
を使用することで、複数のコンポーネントからUIを構成しました。これがReactアプリケーションの基本的な構成要素です。
Propsでデータを渡す
私たちのGreeting
コンポーネントは少し静的です。もし異なる人に挨拶したい場合はどうすればよいでしょうか?ここでprops(propertiesの略)が登場します。Propsは、親コンポーネントから子コンポーネントにデータを渡す方法です。
Propsでコンポーネントを動的にする
Greeting.jsx
を修正して、name
propを受け入れるようにしてみましょう。JavaScript
// src/Greeting.jsx
function Greeting(props) {
return (
<h2>Hello, {props.name}! This is a greeting from my custom component.</h2>
);
}
export default Greeting;
これで、App.jsxで、Greetingコンポーネントにname propを渡すことができます。
JavaScript
// src/App.jsx
import Greeting from './Greeting';
function App() {
return (
<div>
<Greeting name="Alice" />
<Greeting name="Bob" />
<Greeting name="Charlie" />
</div>
);
}
export default App;
これで、それぞれ異なる名前で3つの異なる挨拶が表示されるはずです。Propsを使用すると、異なるデータでコンポーネントを再利用できるため、UIが信じられないほど柔軟になります。
一般的でモダンなJavaScriptのプラクティスとして、関数のパラメータリストでprops
オブジェクトを直接分割代入する方法があります。Greeting.jsx
をリファクタリングしてみましょう:JavaScript
// src/Greeting.jsx
function Greeting({ name }) {
return (
<h2>Hello, {name}! This is a greeting from my custom component.</h2>
);
}
export default Greeting;
これは同じ結果を達成しますが、よりクリーンで簡潔なコードになります。
Stateでコンポーネントのメモリを管理する
Propsはコンポーネントツリーを下にデータを渡すのに優れていますが、コンポーネントが独自のデータを記憶し、管理する必要がある場合はどうなるでしょうか?ここでstateが登場します。Stateは、コンポーネントの内部で管理されるデータです。コンポーネントのstateが変更されると、Reactはそのコンポーネントを自動的に再レンダリングして新しいstateを反映させます。
useState
Hookの紹介
関数コンポーネントでstateを管理するために、Reactの特別な関数であるHookを使用します。最も基本的なHookはuseState
です。
useState
がどのように機能するかを理解するために、簡単なカウンターコンポーネントを構築してみましょう。src
フォルダにCounter.jsx
という名前の新しいファイルを作成します。JavaScript
// src/Counter.jsx
import { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
export default Counter;
これを分解してみましょう:
import { useState } from 'react';
: ReactライブラリからuseState
Hookをインポートします。const [count, setCount] = useState(0);
: これがuseState
Hookの核心です。- 初期値
0
を指定してuseState
を呼び出します。これがstateの開始値です。 useState
は2つの要素を持つ配列を返します。これを分割代入しています:
count
: stateの現在の値。setCount
:count
stateを更新するために使用できる関数。
<p>You clicked {count} times</p>
:count
stateの現在の値を表示します。<button onClick={() => setCount(count + 1)}>
: ボタンがクリックされると、新しい値(count + 1
)でsetCount
関数を呼び出します。これにより、Reactにstateを更新するように指示します。
次に、このCounter
コンポーネントをApp.jsx
に追加してみましょう:JavaScript
// src/App.jsx
import Counter from './Counter';
function App() {
return (
<div>
<h1>My Awesome React App</h1>
<Counter />
</div>
);
}
export default App;
ブラウザにカウンターが表示されるはずです。ボタンをクリックするたびに、数字が増加します。Reactはstateが変更されるたびにCounter
コンポーネントを再レンダリングしています。
ユーザーアクションへの応答:イベント処理
インタラクティビティは、現代のWebアプリケーションの核心です。Reactは、クリック、フォーム送信、キーボード入力などのイベントをシンプルかつ一貫した方法で処理するための機能を提供します。
Counter
コンポーネントのonClick
で基本的なイベントハンドラをすでに見てきました。ユーザー入力を受け付ける簡単なフォームを構築することで、これをさらに探求してみましょう。
NameForm.jsx
という名前の新しいコンポーネントファイルを作成します。JavaScript
// src/NameForm.jsx
import { useState } from 'react';
function NameForm() {
const [name, setName] = useState('');
const handleSubmit = (event) => {
event.preventDefault(); // デフォルトのフォーム送信動作を防止
alert(`Hello, ${name}!`);
};
return (
<form onSubmit={handleSubmit}>
<label>
Name:
<input
type="text"
value={name}
onChange={(event) => setName(event.target.value)}
/>
</label>
<button type="submit">Submit</button>
</form>
);
}
export default NameForm;
このフォームコンポーネントを分析してみましょう:
- 入力フィールドの値を保存するためのstate変数
name
があります。 input
要素のvalue
属性は、私たちのname
stateに設定されています。これにより、Reactが入力の値を制御する制御されたコンポーネントになります。onChange
イベントハンドラは、ユーザーが入力フィールドにタイプするたびに呼び出されます。event.target.value
から新しい値でname
stateを更新します。form
には、フォームが送信されたときにhandleSubmit
関数を呼び出すonSubmit
イベントハンドラがあります。handleSubmit
では、event.preventDefault()
を呼び出して、フォーム送信のデフォルト動作であるページの再読み込みを停止します。その後、ユーザーの名前を含むアラートを表示します。
このNameForm
をApp.jsx
に追加して、実際に見てみましょう。
情報の表示:条件付きレンダリングとリスト
実際のアプリケーションでは、特定の条件に基づいてコンテンツを表示または非表示にする必要があり、頻繁にデータのリストを表示する必要があります。
条件付きレンダリングで表示と非表示を切り替える
ユーザーがログインしているかどうかに応じて異なるメッセージを表示するコンポーネントを作成してみましょう。LoginMessage.jsx
という名前のファイルを作成します。JavaScript
// src/LoginMessage.jsx
function LoginMessage({ isLoggedIn }) {
if (isLoggedIn) {
return <h2>Welcome back!</h2>;
}
return <h2>Please log in.</h2>;
}
export default LoginMessage;
より簡潔な条件付きレンダリングのために、三項演算子を使用することもできます。JavaScript
// src/LoginMessage.jsx
function LoginMessage({ isLoggedIn }) {
return (
<div>
{isLoggedIn ? <h2>Welcome back!</h2> : <h2>Please log in.</h2>}
</div>
);
}
export default LoginMessage;
その後、このコンポーネントをApp.jsx
で使用し、isLoggedIn
propを渡して異なるメッセージを確認できます。
データのリストを表示する
アイテムのリストをレンダリングするには、通常、map()
配列メソッドを使用します。果物のリストを表示するコンポーネントを作成してみましょう。FruitList.jsx
という名前のファイルを作成します。JavaScript
// src/FruitList.jsx
function FruitList() {
const fruits = ['Apple', 'Banana', 'Cherry', 'Date'];
return (
<div>
<h3>My Favorite Fruits:</h3>
<ul>
{fruits.map((fruit, index) => (
<li key={index}>{fruit}</li>
))}
</ul>
</div>
);
}
export default FruitList;
ここでは、fruits
配列をmap
で処理し、各果物に対して<li>
要素を返しています。
key={index}
propに気づくでしょう。アイテムのリストをレンダリングするとき、Reactはリストが変更されたときに効率的に更新するために、各アイテムに一意のkey
が必要です。配列のインデックスをキーとして使用することは、シンプルで静的なリストには許容されます。ただし、アイテムが追加、削除、または並べ替えられる動的なリストの場合、利用可能なデータから一意のIDを使用するのが最善です。
アプリケーションにスタイルを追加する
素晴らしいアプリケーションは見た目も良い必要があります。Reactコンポーネントにスタイルを追加するにはいくつかの方法があります。
CSSスタイルシート
最も簡単な方法は、通常のCSSファイルを使用することです。src
フォルダに、App.css
ファイルがあります。そこにスタイルを追加できます。
例えば、FruitList
コンポーネントにスタイルを追加するには、App.css
に次のように追加します:CSS
/* src/App.css */
.fruit-list {
list-style-type: none;
padding: 0;
}
.fruit-item {
background-color: #f0f0f0;
margin: 5px 0;
padding: 10px;
border-radius: 5px;
}
次に、FruitList.jsx
で、これらのCSSクラスを使用できます。JavaScript
// src/FruitList.jsx
import './App.css'; // CSSファイルをインポートすることを忘れないでください
function FruitList() {
const fruits = ['Apple', 'Banana', 'Cherry', 'Date'];
return (
<div>
<h3>My Favorite Fruits:</h3>
<ul className="fruit-list">
{fruits.map((fruit, index) => (
<li key={index} className="fruit-item">{fruit}</li>
))}
</ul>
</div>
);
}
export default FruitList;
JSXでは、class
はJavaScriptの予約語であるため、代わりにclassName
を使用することに注意してください。
CSS Modules
大規模なアプリケーションの場合、CSS Modulesはスタイルを特定のコンポーネントにスコープ化し、スタイルの競合を防ぐ方法を提供します。CSS Moduleファイルは.module.css
拡張子で命名されます。
FruitList.module.css
を作成してみましょう:CSS
/* src/FruitList.module.css */
.list {
list-style-type: square;
}
.item {
color: blue;
}
次に、FruitList.jsx
で、スタイルをオブジェクトとしてインポートします:JavaScript
// src/FruitList.jsx
import styles from './FruitList.module.css';
function FruitList() {
const fruits = ['Apple', 'Banana', 'Cherry', 'Date'];
return (
<div>
<h3>My Favorite Fruits (Styled with CSS Modules):</h3>
<ul className={styles.list}>
{fruits.map((fruit, index) => (
<li key={index} className={styles.item}>{fruit}</li>
))}
</ul>
</div>
);
}
export default FruitList;
Viteは自動的に一意のクラス名を生成し、FruitList.module.css
のスタイルがFruitList
コンポーネントにのみ適用されるようにします。
React Routerでアプリ内をナビゲートする
ほとんどのWebアプリケーションには複数のページがあります。Reactで構築されたシングルページアプリケーション(SPA)でこれらの「ページ」間のナビゲーションを処理するために、React Routerと呼ばれるライブラリを使用します。
React Routerのセットアップ
まず、React Routerをインストールする必要があります:Bash
npm install react-router-dom
ページの作成
HomePage.jsx
とAboutPage.jsx
という2つの簡単なページコンポーネントを作成してみましょう。JavaScript
// src/HomePage.jsx
function HomePage() {
return (
<div>
<h1>Home Page</h1>
<p>Welcome to the home page of our amazing app!</p>
</div>
);
}
export default HomePage;
JavaScript
// src/AboutPage.jsx
function AboutPage() {
return (
<div>
<h1>About Page</h1>
<p>This is all about our incredible application.</p>
</div>
);
}
export default AboutPage;
ルーターの設定
次に、App.jsx
でルートを設定します。JavaScript
// src/App.jsx
import { BrowserRouter as Router, Routes, Route, Link } from 'react-router-dom';
import HomePage from './HomePage';
import AboutPage from './AboutPage';
function App() {
return (
<Router>
<div>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/about">About</Link>
</li>
</ul>
</nav>
<hr />
<Routes>
<Route path="/" element={<HomePage />} />
<Route path="/about" element={<AboutPage />} />
</Routes>
</div>
</Router>
);
}
export default App;
React Routerの新しいコンポーネントを分解してみましょう:
<Router>
(BrowserRouter
として): アプリケーション全体をラップし、ルーティングを有効にするコンポーネントです。<Link>
: ナビゲーションリンクを作成するために使用されます。<a>
タグに似ていますが、ルーターを認識しています。<Routes>
: 個々のルートをラップするコンポーネントです。<Route>
: URLパスとレンダリングするコンポーネントのマッピングを定義するコンポーネントです。
これで、「Home」と「About」のリンクをクリックすると、ページ全体のリロードなしにコンテンツが変更されます。クライアントサイドルーティングの実装に成功しました!
さらに進む:useEffect
Hook
useState
Hookは、レンダリングされるものに直接影響するstateを管理するためのものです。しかし、APIからのデータのフェッチ、購読の設定、DOMの手動での変更などの副作用についてはどうでしょうか?これには、useEffect
Hookを使用します。
useEffect
Hookは、デフォルトではすべてのレンダリング後に実行されます。偽のAPIからデータをフェッチするコンポーネントを作成して、実際に見てみましょう。
新しいファイルDataFetcher.jsx
を作成します。JavaScript
// src/DataFetcher.jsx
import { useState, useEffect } from 'react';
function DataFetcher() {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
// この関数はコンポーネントのレンダリング後に呼び出されます
const fetchData = async () => {
try {
const response = await fetch('https://jsonplaceholder.typicode.com/posts/1');
const jsonData = await response.json();
setData(jsonData);
} catch (error) {
console.error('Error fetching data:', error);
} finally {
setLoading(false);
}
};
fetchData();
}, []); // 空の依存配列が重要です!
if (loading) {
return <p>Loading...</p>;
}
return (
<div>
<h3>Fetched Data:</h3>
<h4>{data.title}</h4>
<p>{data.body}</p>
</div>
);
}
export default DataFetcher;
ここでuseEffect
を理解する鍵は、2番目の引数、すなわち依存配列です。
- 依存配列を指定しない場合、エフェクトはすべてのレンダリング後に実行されます。
- 空の配列
[]
を指定した場合、エフェクトは最初のレンダリング後に一度だけ実行されます。これは一度だけのデータフェッチに最適です。 - 配列
[prop, state]
に値を指定した場合、それらの値のいずれかが変更されるたびにエフェクトが実行されます。
コンポーネントがロードされたときにデータがフェッチされて表示される様子を見るために、DataFetcher
をApp.jsx
に追加してください。
結論と次のステップ
あなたは長い道のりを歩んできました!あなたは次のことを学びました:
- Viteを使用してモダンなReact開発環境をセットアップする方法。
- 関数コンポーネントを作成し、JSXでUIを記述する方法。
- propsを使用してコンポーネント間でデータを渡す方法。
useState
Hookを使用してコンポーネントレベルのstateを管理する方法。- ユーザーイベントを処理する方法。
- 条件付きで、またリストとしてコンテンツをレンダリングする方法。
- CSSおよびCSS Modulesを使用してコンポーネントにスタイルを追加する方法。
- React Routerを使用してクライアントサイドルーティングを実装する方法。
useEffect
Hookを使用して副作用を処理する方法。
これは大きな成果であり、あなたはこれから構築するための確固たる基盤を手に入れました。Reactの世界は広大でエキサイティングです。次に探求したいトピックをいくつか紹介します:
- その他のHooks:
useContext
、useReducer
、useCallback
、useMemo
などの他の組み込みHooksを深く掘り下げます。 - State管理ライブラリ: より大規模なアプリケーションの場合、Redux、Zustand、Recoilなどのより堅牢なstate管理ソリューションが必要になる場合があります。
- Reactフレームワーク: サーバーサイドレンダリングやフルスタック機能のために、Next.jsのようなReactの上に構築されたフレームワークを探求します。
- テスト: JestやReact Testing Libraryなどのライブラリを使用してReactコンポーネントをテストする方法を学びます。
今あなたができる最も重要なことは、構築し続けることです。実践が鍵です。毎日使用している簡単なウェブサイトやアプリケーションを再現してみてください。新しい機能に挑戦してください。コードを書けば書くほど、より自信を持ち、スキルが向上します。
Reactコミュニティへようこそ。コーディングを楽しんでください!
最大限の生産性で開発チームが協力するための統合されたオールインワンプラットフォームが必要ですか?
Apidogはあなたのすべての要求に応え、Postmanをはるかに手頃な価格で置き換えます!