Reactアプリケーションの作成において、ユーザーインタラクションの処理は非常に重要な要素です。Reactのイベントシステムと状態管理を理解し、効率的に扱うことは、動的で反応の良いアプリケーションを構築するために欠かせません。このガイドでは、Reactの「イベント」と「状態管理」について、基本的な概念から応用までを網羅的に解説します。
1. Reactのイベントシステム
Reactは、ブラウザのネイティブイベントシステムをラップした独自のイベントシステムを提供しています。このイベントシステムの特徴は、イベントのバブリング(伝播)を管理し、パフォーマンスを最適化する点にあります。

イベントの種類
Reactで使える代表的なイベントには、次のようなものがあります:
onClick
(クリックイベント)onChange
(入力変更イベント)onSubmit
(フォーム送信イベント)onKeyDown
/onKeyUp
(キーボードイベント)onMouseEnter
/onMouseLeave
(マウスホバーイベント)
これらのイベントは、HTMLの属性名とほぼ一致していますが、Reactではキャメルケースを使用します。例えば、onclick
はonClick
に変わります。
イベントハンドラーの定義
Reactでは、イベントハンドラーを関数として定義します。例えば、ボタンがクリックされたときに発火するイベントを処理するには、以下のようにします。
javascriptimport React from 'react';
function App() {
const handleClick = () => {
alert('ボタンがクリックされました!');
};
return (
<button onClick={handleClick}>クリックbutton>
);
}
export default App;
ここで、onClick={handleClick}
は、ボタンがクリックされた際にhandleClick
関数を呼び出す仕組みです。
イベントオブジェクト
Reactのイベントハンドラーには、イベントオブジェクトが自動的に渡されます。このオブジェクトは、イベントに関する情報を提供し、例えばevent.target
でクリックされた要素にアクセスできます。
javascriptfunction handleClick(event) {
console.log(event.target); // クリックされた要素
}
2. 状態管理 (State)
Reactでは、コンポーネントの状態をuseState
フックを使って管理します。状態は、コンポーネントが再レンダリングされる条件を決定します。状態が変わると、Reactはそのコンポーネントを再レンダリングし、変更をビューに反映します。
useState
フック
useState
は、状態を管理するためのフックで、状態変数とその更新関数を返します。次の例では、ボタンがクリックされるたびにカウントが増えるアプリケーションを作成します。
javascriptimport React, { useState } from 'react';
function App() {
const [count, setCount] = useState(0); // 状態変数と更新関数の初期化
const handleClick = () => {
setCount(count + 1); // 状態を更新
};
return (
<div>
<p>クリック数: {count}p>
<button onClick={handleClick}>クリックbutton>
div>
);
}
export default App;
このコードでは、count
が状態変数で、setCount
がその値を更新する関数です。ボタンがクリックされるたびに、setCount
が呼ばれ、count
の値が1ずつ増加します。
状態の非同期更新
Reactの状態更新は非同期で行われるため、直前の状態を参照して更新を行いたい場合は、コールバック形式でsetCount
を使用する必要があります。
javascriptconst handleClick = () => {
setCount(prevCount => prevCount + 1); // 前の状態を基に状態を更新
};
これにより、前回の状態が確実に反映されます。
3. 状態とイベントの統合
Reactでは、状態とイベントを組み合わせて、ユーザーのアクションに基づいた動的なUIを作成します。たとえば、テキストフィールドに入力された内容を反映させる場合、次のようにonChange
イベントを使います。
javascriptimport React, { useState } from 'react';
function App() {
const [text, setText] = useState('');
const handleChange = (event) => {
setText(event.target.value); // 入力された値を状態として更新
};
return (
<div>
<input type="text" value={text} onChange={handleChange} />
<p>入力されたテキスト: {text}p>
div>
);
}
export default App;
この例では、テキストフィールドに入力された内容がtext
という状態に保存され、リアルタイムで画面に表示されます。
4. コンポーネント間で状態を共有
Reactでは、状態を親コンポーネントから子コンポーネントに渡すことができます。これにより、状態を複数のコンポーネント間で共有し、連携させることが可能です。
javascriptimport React, { useState } from 'react';
function Parent() {
const [count, setCount] = useState(0);
return (
<div>
<Child count={count} setCount={setCount} />
div>
);
}
function Child({ count, setCount }) {
return (
<div>
<p>親コンポーネントのカウント: {count}p>
<button onClick={() => setCount(count + 1)}>カウントアップbutton>
div>
);
}
export default Parent;
このコードでは、Parent
コンポーネントが状態を管理し、その状態と更新関数をChild
コンポーネントに渡しています。Child
コンポーネントでボタンをクリックすると、Parent
の状態が更新され、親子コンポーネントでその変更が反映されます。
5. 状態のリフトアップ
状態は、データが複数のコンポーネントで必要な場合、親コンポーネントに「リフトアップ」する必要があります。これにより、状態を一元的に管理し、複数のコンポーネントでその状態を共有できます。
まとめ
Reactのイベントシステムと状態管理は、インタラクティブなアプリケーションを構築するための基本です。イベントを適切に処理し、状態を管理することで、ユーザーインタラクションに対応した動的なコンポーネントを作成できます。状態のリフトアップや状態更新のタイミングに注意を払いながら、複雑なアプリケーションの開発に挑戦してみてください。