Client Components
Client Components を使用すると、リクエスト時にクライアントでレンダリングされるインタラクティブな UI を記述できます。Next.js では、クライアントレンダリングはオプトインです。つまり、React がクライアントにレンダリングするコンポーネントを明示的に決定する必要があります。
このページでは、Client Components の仕組み、レンダリング方法、使用するタイミングについて説明します。
クライアント・レンダリングの利点
クライアントでのレンダリングには、以下のような利点があります:
- インタラクティブ性:Client Components は、状態、エフェクト、イベント・リスナーを使用できます
- ブラウザ API:Client Components は、geolocationやlocalStorageのようなブラウザ API にアクセスでき、特定のユースケースのための UI を構築できます
Next.js で Client Components を使う
Client Components を使用するには、React の"use client"ディレクティブをファイルの先頭、インポートの上に追加します。
"use client"
は、Server Component モジュールと Client Component モジュールの境界を宣言するために使用します。つまり、"use client"
を定義することで、子コンポーネントを含む、そのファイルにインポートされた他のすべてのモジュールはクライアントバンドルの一部とみなされ、クライアント上で React によってレンダリングされます。
'use client'
import { useState } from 'react'
export default function Counter() {
const [count, setCount] = useState(0)
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>Click me</button>
</div>
)
}
下図は、ネストされたコンポーネントを示しています。toggle.js
でonClick
とuseState
を使用すると、"use client"
ディレクティブが定義されていない場合、エラーが発生します。これは、デフォルトではこれらの API が利用できないサーバー上でコンポーネントがレンダリングされるためです。toggle.js
に"use client"
ディレクティブを定義することで、コンポーネントとその子コンポーネントを、API が利用可能なクライアント上でレンダリングするよう React に指示できます。
複数の
use client
のエントリーポイントを定義する:React Component ツリーには、複数の
"use client"
エントリーポイントを定義できます。これにより、アプリケーションを複数のクライアントバンドル(またはブランチ)に分割できます。しかし、
"use client"
は、クライアントでレンダリングする必要のあるすべてのコンポーネントで定義する必要はありません。一度境界を定義すると、そこにインポートされたすべての子コンポーネントやモジュールはクライアントバンドルに含まれるとみなされます。