React の ReactElement とは何か?

TwitterFacebookHatena

TL;DR

このページでは、ReactElement の実装方法について詳しく解説しますね。一言で言うと、ReactElement とは React の JSX 要素を表現するための型です。React において、UI を構築する際の基礎的な要素を表現するために使われます。

開発環境 バージョン
Next.js 13.4.4
TypeScript 5.0.4
Emotion 11.11.0
React 18.2.0

ReactElement とは?

ReactElement は React の世界で最も基本的な建設ブロックです。それは単なる JavaScript オブジェクトで、React コンポーネントが画面に何を描画すべきかを記述します。具体的には、ReactElement はコンポーネント(または DOM タグ)の型、それが受け取る props、そして子要素を保持します。

以下に、ReactElement の非常に基本的な使用例を示します。

const element: ReactElement = <h1>Hello, world</h1>

上記のコードでは、ReactElement のインスタンスである element を作成しています。このインスタンスは <h1> タグとその子要素であるテキスト 'Hello, world' を表現しています。

ReactNode, ReactChild, ReactElement の違い

以下に、それぞれの型の主な用途を示す表を作成しました。ReactNode, ReactChild, ReactElement の違いです。

使い所
ReactNode 最も包括的な型で、React がレンダリングできる任意の型をカバーします。主にコンポーネントの戻り値の型や、props として子要素を取る場合に使用します。
ReactChild React が子要素として取り扱える要素を表す型です。多くの場合、子要素を表現するために用いられます。
ReactElement JSX 要素または React コンポーネントを表す型です。主に React のcreateElement関数の戻り値として使用され、React コンポーネントがレンダリングする要素を表します。

これらの型は、コード内で要素やコンポーネントを適切に型付けするために用いられます。どの型を使用するべきかは、特定の状況や要件によります。

React の主要な型についての関係図は以下のようになります。

ReactNode
  └── ReactChild
      ├── ReactElement
      ├── ReactText (string | number)
      └── boolean | null | undefined

これらは、React の様々な値がどのように型付けされるかを説明します。

ReactNode

これは React が描画することが可能なもの全てを表す型です。具体的には以下のものが含まれます。

  • ReactElement
  • ReactFragment
  • ReactPortal
  • string
  • number
  • boolean
  • null
  • undefined

ReactChild

これはReactNodeの一部を表す型で、React が子要素として扱うことが可能なものを示します。

  • ReactElement
  • string
  • number
  • boolean
  • null
  • undefined

ReactElement

これは React のコンポーネント(関数コンポーネントやクラスコンポーネント)または DOM 要素(divspaninputなど)から生成されるオブジェクトを表します。この型は主に React のcreateElement関数の戻り値として使われます。

これらの型は React の仮想 DOM で非常に重要な役割を果たし、React の描画システムがどのように動作するかを理解するのに役立ちます。

Next.js で、ReactElement を実装

では、Next.js と TypeScript を使って ReactElement の具体的な使用例を見てみましょう。以下に、シンプルな Next.js ページコンポーネントを示します。

pages/index.tsx

import { ReactElement } from 'react'

type Props = {
  message: string
}

const HomePage = ({ message }: Props): ReactElement => {
  return <h1>{message}</h1>
}

export default HomePage

上記のコードでは、ReactElement を返す関数コンポーネント HomePage を定義しています。HomePage コンポーネントは message という名前の prop を受け取り、そのメッセージを <h1> タグの中に描画します。

コンポーネントが ReactElement を返すと明示することで、TypeScript はコンポーネントが正しい JSX を返すことを確認します。もしコンポーネントが JSX 以外のもの(例えば数値や文字列など)を返そうとすると、TypeScript はエラーを出します。

ReactElement のプロパティ

ReactElement は、その要素に関する情報を保持するプロパティをいくつか持っています。以下に、それらの主要なプロパティについて説明します。

import React, { ReactElement } from 'react'

const element: ReactElement = <h1>Hello, world</h1>

console.log(element.type) // => 'h1'
console.log(element.props.children) // => 'Hello, world'

type プロパティは、要素の型を表します。上記の例では、element.type'h1' を返します。また、props プロパティは、要素に渡された props を格納します。この例では、element.props.children'Hello, world' を返します。

ReactElement の活用

ReactElement は、コンポーネントのレンダリングをカスタマイズする際に有効に活用できます。例えば、子要素を動的に操作したり、ある条件下で特定の要素を描画したりすることができます。

以下に、ReactElement を活用したコンポーネントの例を示します。

components/CustomComponent.tsx

import { ReactElement, ReactNode } from 'react'

type Props = {
  children: ReactNode
  condition: boolean
}

const CustomComponent = ({ children, condition }: Props): ReactElement => {
  if (condition) {
    return <div>{children}</div>
  } else {
    return <div>条件に合致しませんでした。</div>
  }
}

export default CustomComponent

この CustomComponent は、condition prop が true の場合には子要素を描画し、そうでない場合にはデフォルトのメッセージを描画します。このように、ReactElement を使うことで、要素の描画を動的に制御することができます。

React の ReactElement とは何か?