use client ディレクティブ

'use client' ディレクティブは、クライアントサイドでレンダリングされるコンポーネントのエントリーポイントを宣言します。このディレクティブは、状態管理、イベントハンドリング、ブラウザAPIへのアクセスなど、クライアントサイドのJavaScript機能を必要とするインタラクティブなユーザーインターフェース(UI)を作成する際に使用します。これはReactの機能です。

知っておくと便利:

クライアントコンポーネントを含むすべてのファイルに 'use client' ディレクティブを追加する必要はありません。サーバーコンポーネント内で直接レンダリングしたいコンポーネントを含むファイルにのみ追加します。'use client' ディレクティブはクライアントとサーバーの境界を定義し、そのようなファイルからエクスポートされるコンポーネントはクライアントへのエントリーポイントとして機能します。

使用方法

クライアントコンポーネントのエントリーポイントを宣言するには、'use client' ディレクティブをファイルの先頭、すべてのインポートの前に追加します:

'use client'

import { useState } from 'react'

export default function Counter() {
  const [count, setCount] = useState(0)

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>増加</button>
    </div>
  )
}

'use client' ディレクティブを使用する場合、クライアントコンポーネントのpropsはシリアライズ可能でなければなりません。これは、サーバーからクライアントにデータを送信する際にReactがシリアライズできる形式である必要があることを意味します。

'use client'

export default function Counter({
  onClick /* ❌ 関数はシリアライズ不可能 */,
}) {
  return (
    <div>
      <button onClick={onClick}>増加</button>
    </div>
  )
}

サーバーコンポーネント内でのクライアントコンポーネントのネスト

サーバーコンポーネントとクライアントコンポーネントを組み合わせることで、パフォーマンスに優れかつインタラクティブなアプリケーションを構築できます:

  1. サーバーコンポーネント: 静的なコンテンツ、データフェッチ、SEOに適した要素に使用します。
  2. クライアントコンポーネント: 状態、エフェクト、ブラウザAPIを必要とするインタラクティブな要素に使用します。
  3. コンポーネント構成: サーバーとクライアントのロジックを明確に分離するために、必要に応じてクライアントコンポーネントをサーバーコンポーネント内にネストします。

以下の例では:

  • Header は静的なコンテンツを扱うサーバーコンポーネントです。
  • Counter はページ内でインタラクティブ性を実現するクライアントコンポーネントです。
import Header from './header'
import Counter from './counter' // これはクライアントコンポーネントです

export default function Page() {
  return (
    <div>
      <Header />
      <Counter />
    </div>
  )
}

リファレンス

'use client' の詳細については、Reactドキュメントを参照してください。

On this page