Reactについての知識
・Reactの特徴
Reactは、ユーザインターフェースを作るためのJavaScriptライブラリです。普通のJavaScriptでは、命令的にDOMを操作しますが、Reactは宣言的なやり方で、状態に応じてビュー(画面)を自動で更新してくれます。コンポーネントごとにUIを作れるので、部品みたいに再利用できますし、フックを使えば、状態管理や副作用の処理も簡単にできます。
・コンポーネント
**Reactのコンポーネントは、アプリケーションを小さく、再利用可能な部品に分割して、保守性を高めるものです。**Reactのアプリケーションは、こうしたコンポーネントを組み合わせて作成されます。コンポーネントは、画面上の特定の部分(ビュー)を担当し、その見た目や振る舞いを独立して管理することができます。
コンポーネントのポイント
- 再利用可能: コンポーネントはひとつ作っておけば、アプリ内の別の場所でも何度でも使えます。異なる「props」を渡すことで同じコンポーネントでも異なる内容を表示できます。これにより、コードの重複を減らし、保守性を高めます。
- 自己完結型: 各コンポーネントは、自分自身の見た目(HTMLのような構造)、ロジック(JavaScriptのコード)、スタイル(CSS)を持つことができます。これにより、UIを細かく管理しやすくなります。
- 親子関係: コンポーネントは入れ子にして使うことができます。大きなコンポーネントの中に小さなコンポーネントを含めることで、複雑なUIをシンプルに分割して管理できます。
- 親コンポーネント: 他のコンポーネントを内部に持つコンポーネント。
- 子コンポーネント: 親コンポーネント内に配置され、親から「props」を受け取って表示内容を変えることができます。
コンポーネントの種類
Reactには主に2種類のコンポーネントがありますが、最近は関数コンポーネントが推奨されています。
関数コンポーネントはシンプルで軽量なコンポーネントです。関数として定義し、propsを受け取ってUIを描画(びょうが)します。React Hooksを使って、状態管理や副作用の処理ができます。
React 16.8以前は、状態やライフサイクルメソッドを扱うためにクラスコンポーネントがよく使われていました。クラスとして定義され、this.state
やthis.props
を使用します。
ライフサイクル
Reactのクラスコンポーネントにはライフサイクルメソッドがあり、コンポーネントの生成から破棄までの過程で特定のタイミングで自動的に呼び出されます。
クラスコンポーネントのライフサイクルは主に3つのフェーズに分かれています。マウント時(mount)には初期化処理を行い、更新時(update)には状態やpropsの変化に応じた処理を行い、アンマウント時(unmount)には不要になったリソースのクリーンアップを行います。
ただし、React 16.8以降では、関数コンポーネントとHooks(特にuseEffect
フック)の使用が推奨されており、クラスコンポーネントに頼らなくても同じようなライフサイクルの処理を実現できるようになっています。新規開発では関数コンポーネントの使用が一般的です。
マウントフェーズ
マウントフェーズはコンポーネントが初めてDOMに挿入される過程です。
**constructor()**はコンポーネントが初めて作成されるときに呼ばれるメソッドです。状態(this.state
)の初期化や、イベントハンドラのバインドを行います。super(props)
を呼び出して、React.Component
のコンストラクタを継承する必要があります。
**render()**は必須のメソッドで、コンポーネントが表示するUIを定義します。JSXを返すメソッドで、実際のDOMにどのようにレンダリングされるかを決めます。
**componentDidMount()**はコンポーネントが 初めてDOMにマウントされた後に呼ばれるメソッドです。初回のレンダリング後に一度だけ実行され、データのフェッチやサブスクライブ(イベントリスナーの設定)などを行うのに適しています。
更新フェーズ
更新フェーズは、コンポーネントの状態(state
)や親から渡されるprops
が変更されたときに発生します。このフェーズでは、再レンダリングが行われる前後で複数のメソッドが呼ばれます。
**shouldComponentUpdate(nextProps, nextState)**は再レンダリングするかどうかを制御するメソッドです。
更新時再度**render()**メソットが呼ばれ、UIを更新します。
**componentDidUpdate(prevProps, prevState)**はコンポーネントの更新が完了し、再レンダリングがDOMに反映された後に呼ばれるメソッドです。
アンマウントフェーズ
アンマウントフェーズは、コンポーネントがDOMから削除される際に実行される処理です。
**componentWillUnmount()**はタイマー(Timer)のクリアやイベントリスナー(Event Listener)の解除、サブスクライブ(subscribe)の解除など、リソースのクリーンアップを行うのに使います。
関数コンポーネント
メリット
関数コンポーネントはシンプルであり、クラスコンポーネントに比べてコードが短く、可読性(かどくせい)が高いです。状態やライフサイクルを管理するためのReact Hooksを使うことで、複雑なクラスベースのコードを関数ベースの簡潔な記述に置き換えられます。特にuseState
やuseEffect
の登場により、関数コンポーネントで状態管理やライフサイクルの処理が非常に簡単で直感的になりました。
useStateは状態を管理するために使われ、クラスコンポーネントのthis.state
とthis.setState
に相当しますが、コードがずっとシンプルです。
useEffectは副作用(データフェッチやDOMの変更など)を処理するためのフックです。クラスコンポーネントのcomponentDidMount
やcomponentDidUpdate
、componentWillUnmount
などを1つの関数で置き換えられます。依存リストを使ってどの状態やpropsが変わったときに実行するかを制御でき、またアンマウント時のクリーンアップ処理も1箇所で書けるため、非常に効率的です。
まとめると、関数コンポーネントは、シンプルで読みやすく、Hooksによって状態管理やライフサイクル処理が容易になり、パフォーマンスも向上するため、Reactの公式推奨として今後の標準的な選択肢です。