コンポーネントはReactアプリケーションの構成要素であり、複雑なユーザーインターフェースを小さく管理しやすい単位に分割することで、大規模なアプリの開発や保守を容易にしてくれます。
コンポーネントの種類
Reactには主に以下の2種類のコンポーネントがあります:
- 関数型コンポーネント(Functional Components)
- クラスベースコンポーネント(Class-based Components)
現在のReactでは、関数型コンポーネントが主流です。本記事でもすべて関数型の例を用いています。
コンポーネントの基本的な考え方
コンポーネントは、UIを記述する要素を返すJavaScript関数のようなものです。このUIは、JSXというJavaScriptの拡張構文で表現されます。JSXはHTMLに似ていますが、より宣言的な記述が可能です。
コンポーネントの例
function Greeting() {
const name = "John";
{/* 結果:Hello John */}
return <h1 className="title">Hello {name}</h1>;
}
この例では、Greeting
というコンポーネントを定義しています。h1
タグの中の {}
はJavaScriptの式を埋め込むために使われており、name
変数の値が表示されます。
class
ではなく className
を使っているのは、class
がJavaScriptの予約語だからです。
また、JSX内のコメントは {/* コメント */}
の形式で書く必要があります。
コンポーネント名は大文字で始める理由
Reactでは、大文字で始まる名前を「カスタムコンポーネント」として認識します。一方で、小文字で始まるタグ(例:<div>
や <span>
)はHTMLの標準要素として扱われます。この区別によって、ReactはHTMLタグと開発者が定義したコンポーネントを区別します。
コンポーネントの使い方
Greeting
コンポーネントを使用するには、次のように記述します:
<Greeting />
<Greeting />
とスラッシュで閉じているのは、JSXではすべてのタグが明示的に閉じられている必要があるためです。子要素がないコンポーネントやタグでも、/>
が必要です。
複数要素の返却とFragmentの使い方
以下のように複数の要素を返そうとすると、エラーになります:
function Greeting() {
const name = "John";
return <h1>Hello {name}</h1>
<p>Nice to meet you.</p>
}
エラーメッセージ:
Adjacent JSX elements must be wrapped in an enclosing tag
(隣接するJSX要素は囲むタグでラップする必要があります)
このエラーを解消するには、<div>
などの親要素で囲むか、React Fragmentを使います。
import { Fragment } from 'react';
function Greeting() {
const name = "John";
return (
<Fragment>
<h1>Hello {name}</h1>
<p>Nice to meet you.</p>
</Fragment>
);
}
省略記法として、空のタグ <>
と </>
を使うこともできます:
function Greeting() {
const name = "John";
return (
<>
<h1>Hello {name}</h1>
<p>Nice to meet you.</p>
</>
);
}
まとめ
Reactコンポーネントは、UIを小さな部品に分割して再利用可能にするための仕組みです。JSXを使って見た目を定義し、props
やstate
によって動的な振る舞いを実現します。現代のReactでは関数型コンポーネントが主流であり、JSXと組み合わせることで直感的かつ強力なUI開発が可能になります。