【JavaScript】初心者だけどReactを使ってみたい。

「最近よく聞くReactって何?」 「Webサイトやアプリを作るのに便利らしいけど、難しそう…」

そんな風に思っているWeb制作初心者の方へ。この記事では、人気JavaScriptライブラリであるReactの基本を、専門用語の解説やたくさんのサンプルコードを交えながら、分かりやすく解説します。

HTML、CSS、JavaScriptの基礎知識があれば大丈夫!この記事を読めば、Reactがどんなもので、どうやって使うのか、基本的な概念が理解できるようになります。

React開発とNode.jsの役割:はじめに知っておきたいこと

本格的なReactアプリケーション開発を進める上で、Node.js というJavaScript実行環境が基本的に必要になります。なぜなら、現代のReact開発はNode.jsとそのパッケージマネージャー(npm または yarn)の上に成り立っているからです。

  • 開発環境の構築Create React App のようなツールを使ってReactプロジェクトの雛形を簡単に作成できますが、これらはNode.jsが必要です。
  • パッケージ管理:React本体や関連ライブラリ(ルーティング、状態管理など)のインストールやバージョン管理にnpm/yarnを使います。
  • ビルドプロセス:JSXや最新のJavaScript構文を、多くのブラウザが理解できる形式に変換(トランスパイル)したり、ファイルを一つにまとめたり(バンドル)する作業(ビルド)に、Node.js上で動作するツール(Webpack, Babelなど)が使われます。
  • 開発サーバー:コードの変更を即座にブラウザに反映させるホットリロード機能などを持つ開発用サーバーも、Node.js上で動作します。

このように、効率的でモダンなReact開発を行うためには、Node.jsの環境がほぼ必須となります。「Node.jsのインストール方法」などで検索し、事前に開発環境を整えておくことを強く推奨します。

「でも、Node.jsの環境構築はまだ難しい… ちょっとReactを試してみたいだけなんだけど…」

という方もいるかもしれません。ご安心ください! Node.jsを使わずに、ブラウザだけでReactコード(特にJSX)を手軽に試す方法も存在します。この記事の後半でその方法(Babel Standalone版を使った方法)も紹介しますので、まずはReactの基本的な考え方を学んでいきましょう。

なぜ今Reactを学ぶべき?

Reactは、Facebook(現Meta)が開発した、ユーザーインターフェース(UI)を作るためのJavaScriptライブラリです。多くのモダンなWebサイトやWebアプリケーションで採用されており、学ぶメリットがたくさんあります。

  • 効率的な開発: UIを「コンポーネント」という部品に分けて作るため、再利用しやすく管理が楽になります。
  • 高いパフォーマンス:仮想DOM」という仕組みにより、画面の更新が高速です。
  • 豊富なエコシステム: 多くの開発者に使われており、関連ツールや情報が豊富です。
  • 高い需要: Reactスキルを持つエンジニアは、多くの企業で求められています。

Reactのコアコンセプト:まずはここを押さえよう!

Reactを理解するために重要な、いくつかの基本的な概念を見ていきましょう。

1. コンポーネント (Component)

Reactでは、UIをコンポーネントという独立した部品の集まりとして考えます。例えば、ボタン、ヘッダー、リスト項目などをそれぞれコンポーネントとして作成し、それらを組み合わせて全体のUIを構築します。

  • 部品化のメリット
    • コードの見通しが良くなる
    • 同じ部品を使い回せる(再利用性)
    • 修正や機能追加がしやすくなる

コンポーネントは主に「関数コンポーネント」を使って作ります。これは、見た目(JSX)を返すシンプルなJavaScript関数です。

// シンプルな関数コンポーネントの例
function WelcomeMessage() {
  return <h1>こんにちは、Reactの世界へ!</h1>; // これがJSX
}

// --- 専門用語解説 ---
// **コンポーネント (Component):** UIを構成する独立した部品。HTML、CSS、JavaScriptを一つにまとめたものとイメージすると分かりやすい。

2. JSX (JavaScript XML)

上のコード例で <h1> タグがJavaScript関数の中に直接書かれていることに気づきましたか?これがJSXです。JSXはJavaScriptの拡張構文で、JavaScriptの中にHTMLのようなタグを直接書くことができます。

  • JSXのメリット
    • どんなUI構造になるか、コードを見ただけで直感的に理解しやすい。
    • HTMLタグの中に {} を使うことでJavaScriptの式(変数や関数呼び出しなど)を埋め込める。
function UserProfile(props) {
  const userName = "山田太郎";
  const userAge = 30;

  return (
    <div> {/* JSXでは、複数の要素を返す場合は一つの親要素で囲む必要がある */}
      <h2>ユーザープロフィール</h2>
      <p>名前: {userName}</p> {/* JavaScript変数を埋め込み */}
      <p>年齢: {userAge}</p>
      <p>ステータス: {userAge >= 20 ? '成人' : '未成年'}</p> {/* 三項演算子も使える */}
    </div>
  );
}

// --- 専門用語解説 ---
// **JSX (JavaScript XML):** JavaScript内でHTMLに似た構文を書けるようにする拡張機能。最終的には通常のJavaScriptオブジェクトに変換される。Node.js環境ではBabelなどのツールが変換を担当するが、後述の方法でブラウザ上でも変換可能。

3. Props (プロパティ)

コンポーネントは単独で使われるだけでなく、他のコンポーネントからデータを受け取って表示を変えたい場合があります。その際に使うのがProps(プロパティ)です。Propsは、親コンポーネントから子コンポーネントへデータを渡すための仕組みです。

  • Propsの役割:
    • コンポーネントに外部から情報を与える。
    • コンポーネントの再利用性を高める(渡すデータによって表示を変えられる)。

Propsは、関数コンポーネントの引数としてオブジェクト形式で渡ってきます。

// 子コンポーネント:Propsを受け取る
function Greeting(props) {
  return <p>{props.message}{props.name}さん!</p>;
}

// 親コンポーネント:子コンポーネントにPropsを渡す
function App() {
  return (
    <div>
      <Greeting message="おはよう" name="田中" /> {/* messageとnameという名前でPropsを渡す */}
      <Greeting message="こんにちは" name="鈴木" />
      <Greeting message="こんばんは" name="佐藤" />
    </div>
  );
}

// --- 専門用語解説 ---
// **Props (Properties):** 親コンポーネントから子コンポーネントへ渡されるデータ。読み取り専用で、子コンポーネント内で直接変更することはできない(データの流れは一方向)。

4. State (ステート)

Propsは親から子への一方通行のデータでしたが、コンポーネント自身が内部でデータを持ち、ユーザー操作などによってそのデータを変化させたい場合があります。そのために使われるのがState(ステート)です。

  • Stateの役割:
    • コンポーネント固有の、時間とともに変化するデータを保持する。
    • Stateが更新されると、Reactが自動的にUIを再描画(レンダリング)する。

関数コンポーネントでStateを使うには、useState フックを利用します。

import React, { useState } from 'react'; // 通常、Node.js環境ではこのようにインポート

// ※Node.jsなしで試す場合は書き方が少し異なります(後述)

function Counter() {
  // useStateフックを使ってStateを宣言
  // count: State変数(現在の値)
  // setCount: Stateを更新するための関数
  // useState(0): 初期値を0に設定
  const [count, setCount] = useState(0); // Node.js環境での一般的な書き方

  // ボタンがクリックされたときに呼ばれる関数
  const increment = () => {
    setCount(count + 1); // setCount関数を使ってStateを更新
  };

  const decrement = () => {
    setCount(count - 1); // setCount関数を使ってStateを更新
  };

  return (
    <div>
      <h2>カウンター</h2>
      <p>現在のカウント: {count}</p>
      <button onClick={increment}>+</button> {/* ボタンクリックでincrement関数を実行 */}
      <button onClick={decrement}>-</button> {/* ボタンクリックでdecrement関数を実行 */}
    </div>
  );
}

// --- 専門用語解説 ---
// **State (ステート):** コンポーネントが内部で保持し、変更可能なデータ。ユーザーの入力、APIからの応答などに応じて変化する。
// **フック (Hook):** 関数コンポーネントにStateやライフサイクルなどのReactの機能を追加するための特別な関数。`useState`, `useEffect` などがある。`use`で始まる名前が特徴。
// **useState:** 関数コンポーネントでStateを管理するための基本的なフック。

5. イベント処理 (Event Handling)

ボタンクリック、フォーム入力、マウスオーバーなど、ユーザーのアクションに応じて何か処理を行いたい場合、イベント処理を設定します。Reactのイベント処理は、HTMLのイベント処理と似ていますが、いくつか違いがあります。

  • 命名規則: イベント名はキャメルケース(例: onclick ではなく onClick)。
  • 関数の指定: イベントハンドラには、文字列ではなく関数そのものを渡す。
function ButtonAlert() {
  const handleClick = () => { // イベントハンドラ関数
    alert('ボタンがクリックされました!');
  };

  return (
    <button onClick={handleClick}> {/* onClickイベントに関数を指定 */}
      クリックしてね
    </button>
  );
}

// --- 専門用語解説 ---
// **イベントハンドラ (Event Handler):** 特定のイベント(クリック、入力など)が発生したときに実行される関数。

6. レンダリングと仮想DOM (Rendering & Virtual DOM)

Reactがコンポーネントとデータ(PropsやState)を元に、実際のWebページの見た目(DOM)を生成・更新するプロセスをレンダリングと呼びます。

Reactの大きな特徴の一つが仮想DOM (Virtual DOM) です。Stateなどが変更されるたびに、Reactはまずメモリ上に「仮想的なDOM」を構築し、前回の仮想DOMと比較して変更があった部分だけを実際のDOMに反映させます。

  • 仮想DOMのメリット:
    • 実際のDOM操作はコストが高いが、仮想DOMを使うことで最小限のDOM操作で済むため、パフォーマンスが向上する。
// 例:Stateが変更されると、Reactが差分を計算し、効率的に画面を更新する

function TextInput() {
  const [text, setText] = useState(''); // import { useState } from 'react'; が必要

  const handleChange = (event) => {
    setText(event.target.value); // 入力があるたびにStateが更新される
  };

  return (
    <div>
      <input type="text" value={text} onChange={handleChange} />
      <p>入力中のテキスト: {text}</p> {/* Stateの変更が即座に反映される */}
    </div>
  );
}

// --- 専門用語解説 ---
// **レンダリング (Rendering):** Reactコンポーネントから画面要素(DOM)を生成するプロセス。
// **DOM (Document Object Model):** HTMLやXML文書を操作するためのAPI(プログラミングインターフェース)。Webページの内容や構造、スタイルを表現するツリー構造。
// **仮想DOM (Virtual DOM):** 実際のDOMを模倣した、メモリ上の軽量なJavaScriptオブジェクト表現。Reactはこれを使って変更差分を効率的に計算する。

React開発環境の準備(推奨:Node.js + Create React App)

前述の通り、本格的な開発にはNode.js環境が推奨されます。Node.jsがインストールされていれば、以下のコマンドで簡単にReactプロジェクトを開始できます。

# npx (npmに付属) を使ってCreate React Appを実行しプロジェクト作成
npx create-react-app my-react-app

# 作成されたディレクトリに移動
cd my-react-app

# 開発サーバーを起動
npm start

これにより、開発に必要な設定(BabelによるJSX変換、Webpackによるバンドル、開発サーバーなど)がすべて含まれた環境が手に入ります。

Node.jsなしでReactを手軽に試す方法 (Babel Standalone)

Node.jsの環境構築をせずに、ブラウザだけでReact (特にJSX) を試したい場合は、CDN (Content Delivery Network) と Babel Standalone を利用する方法があります。これは、HTMLファイルに直接ReactとBabelのライブラリを読み込ませ、ブラウザにJSXの変換と実行を行わせる方法です。

メリット

  • Node.jsのインストールや環境構築が不要。
  • HTMLファイル一つで手軽に試せる。

デメリット

  • ブラウザ側でJSXの変換を行うため、表示速度が遅くなる可能性がある。
  • モジュールのインポート ( import ... from ... ) が標準では使えない(書き方が異なる)。
  • 複雑なアプリケーションの開発や、本番環境での利用には全く適していない。あくまで学習や簡単なテスト用。

試してみよう:カウンターアプリ(Node.jsなし版)

以下の内容でHTMLファイル(例:react_test.html )を作成し、ブラウザで開いてみてください。

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8" />
  <title>React (Babel Standalone) テスト</title>
  <script src="https://unpkg.com/react@18/umd/react.development.js" crossorigin></script>
  <script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js" crossorigin></script>
  <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>

  <div id="root"></div>

  <script type="text/babel"> // type属性を "text/babel" にする!

    // useStateフックを使うためにReactオブジェクトから取り出す
    const { useState } = React;

    // カウンターコンポーネント (関数コンポーネント)
    function Counter() {
      // Stateの宣言 (Node.js環境と同じように書ける)
      const [count, setCount] = useState(0);

      const increment = () => {
        setCount(count + 1);
      };

      const decrement = () => {
        setCount(count - 1);
      };

      // JSXを返す
      return (
        <div>
          <h2>カウンター (Babel Standalone)</h2>
          <p>現在のカウント: {count}</p>
          <button onClick={increment}>+</button>
          <button onClick={decrement}>-</button>
        </div>
      );
    }

    // 6. React要素を #root div にレンダリング
    const container = document.getElementById('root');
    const root = ReactDOM.createRoot(container); // React 18以降の推奨される書き方
    root.render(<Counter />); // Counterコンポーネントを描画

  </script>

</body>
</html>

コードのポイント:

  1. <head>内でReact, ReactDOM, Babel StandaloneのライブラリをCDN経由で読み込みます。順番が重要です。
  2. Reactコード(特にJSXを含む部分)は <script type="text/babel"> タグの中に記述します。この type="text/babel" があることで、Babel Standaloneが中のコードをブラウザで解釈・実行可能なJavaScriptに変換してくれます。
  3. useStateなどのフックは React.useState のように React オブジェクト経由でアクセスするか、分割代入 const { useState } = React; で取り出して使います。import文は使えません。
  4. ReactDOM.createRoot() を使って描画先のDOM要素を指定し、root.render() でコンポーネントを描画します。

この方法を使えば、Node.js環境がなくてもReactの基本的な書き方や動きを手軽に体験できます。

簡単なTodoリストを作ってみよう!(Node.js環境推奨)

(前の回答と同じTodoリストのコード例。ただし、このコードはimport文を含んでいるため、Node.js環境での実行が前提となります。)

import React, { useState } from 'react'; // Node.js環境でのimport

// (Todoリストのコードは前の回答と同じ... Node.jsなし版で書くならuseStateなどの取得方法を変える必要がある)

// Todoアイテムを表示するコンポーネント
function TodoItem({ todo, index, removeTodo }) {
  // ... (実装は前の回答と同じ)
}

// Todoリスト全体を管理するコンポーネント
function TodoList() {
  const [todos, setTodos] = useState(['Reactを学ぶ', '買い物に行く']);
  const [inputValue, setInputValue] = useState('');

  // ... (addTodo, removeTodo, handleInputChangeの実装は前の回答と同じ)

  return (
    <div>
      {/* ... (JSX構造は前の回答と同じ) */}
    </div>
  );
}

export default TodoList;

注意: 上記のTodoリストのコードは import 文を使っているため、先に紹介したBabel Standaloneの方法で直接HTMLに記述する場合は、useState の取得方法などを const { useState } = React; のように変更する必要があります。

まとめ

今回はReactの基本的な概念である、コンポーネント、JSX、Props、State、イベント処理、レンダリングと仮想DOMについて解説しました。また、React開発におけるNode.jsの重要性と、Node.jsなしで手軽に試す方法も紹介しました。

  • 本格的な開発にはNode.js環境が推奨されますが、Babel Standaloneを使えばブラウザだけで手軽にReactを体験できます。
  • Reactはコンポーネントという部品でUIを組み立てます。
  • JSXで見た目を直感的に記述できます。
  • Propsで親から子へデータを渡し、Stateでコンポーネント内の状態を管理します。
  • 仮想DOMにより効率的な画面更新が可能です。

最初は覚えることが多く感じるかもしれませんが、実際にコードを書きながら少しずつ慣れていくのが一番です。

次のステップとしては:

  • Node.js環境を構築し、Create React Appで実際にプロジェクトを作ってみる。(推奨)
  • Babel Standaloneの方法で他のReactの機能(useEffectなど)を試してみる。
  • React Router(ページ遷移)、状態管理ライブラリ(Redux, Zustandなど)について学ぶ。

Reactは非常に強力で楽しいライブラリです。ぜひこの機会に学習を始めて、モダンなWeb開発の世界に飛び込んでみてください!

PR広告


楽天ブックスでReactの本を探す