You're importing a component that needs useState/useEffect
Next.js App RouterでクライアントコンポーネントにuseClientディレクティブがない場合のエラー
概要
Next.js 13以降のApp Routerで、useStateやuseEffectなどのクライアントサイドのHooksを使用しているコンポーネントに'use client'ディレクティブがない場合に発生するエラーです。
エラーメッセージ
You're importing a component that needs useState. It only works in a Client Component but none of its parents are marked with "use client", so they're Server Components by default.
You're importing a component that imports client-only code. It only works in a Client Component.
原因
- use clientの記述忘れ: クライアントコンポーネントに
'use client'がない - Hooksの使用: Server ComponentでuseState/useEffectを使用
- ブラウザAPI: window/documentなどのブラウザAPIを使用
- サードパーティライブラリ: クライアント専用ライブラリをServer Componentでインポート
解決策
1. ‘use client’ ディレクティブを追加
| |
2. コンポーネントを分離
| |
3. イベントハンドラの分離
| |
4. ブラウザAPIの使用
| |
5. サードパーティライブラリのラップ
| |
6. Contextの使用
| |
7. フォームの処理
| |
Server vs Client Component
| 機能 | Server Component | Client Component |
|---|---|---|
| データフェッチ | ✅ async/await | ❌ useEffect |
| useState/useEffect | ❌ | ✅ |
| ブラウザAPI | ❌ | ✅ |
| イベントハンドラ | ❌ | ✅ |
| バンドルサイズ | 小さい | 大きい |
よくある間違い
- すべてのコンポーネントに
'use client'を付ける(パフォーマンス低下) - Server Componentで直接onClickを使う
'use client'をファイルの途中に書く(先頭に書く必要がある)
関連エラー
参考リンク
Next.js の他のエラー
この記事は役に立ちましたか?