コース一覧
Next.jsフルスタック:サーバー・データ取得・API
use clientの宣言

Next.jsフルスタック:サーバー・データ取得・API

Server ComponentsとClient Components、use client、サーバーfetch、asyncコンポーネント、動的ルート、params、notFound、キャッシュ、Route Handler、GET・POST API、Server Actions、フォームを扱う全24レッスンのフルスタックコースです。fleamaの商品取得と出品機能をNext.js内へ実装します。

1
Server / Client Components
01. サーバーで動く部品10分
02. Server Components15分
03. use clientの宣言15分
04. どちらに置くか15分
05. 境界をまたぐ合成15分
06. 境界の設計15分
07. つくる - 部品の仕分け20分
08. 第4章クイズ15分
2
データ取得と動的ルート
01. サーバーでfetch15分
02. asyncコンポーネント15分
03. 動的ルート15分
04. paramsを受け取る15分
05. notFoundで404にする15分
06. キャッシュのきほん10分
07. 検索をサーバーで15分
08. つくる - サーバー取得化20分
09. 第5章クイズ15分
3
API Routesとフォーム
01. Route Handler15分
02. GET APIを作る15分
03. POST APIを作る15分
04. Server Actionsの触り15分
05. フォーム実装15分
06. つくる - 受け口の完成20分
07. 第6章クイズ15分

use clientの宣言

use client を書き忘れると落ちる

ブラウザ側に置きたいと伝える

押されたら数が増えるカートボタンは、サーバーでは作れません。押すのはブラウザの中の出来事だからです。そこで、その部品だけを「ブラウザで動かす」と宣言します。書くのはファイルのいちばん上の1行だけです。

TypeScript (JSX)

"use client"; import { useState } from "react"; export default function CartButton() { const [count, setCount] = useState(0); return <button onClick={() => setCount(count + 1)}>カートに追加</button>; }

"use client" は import よりも上、ファイルの1行目に書きます。途中に書いても効きません。

これは境界の宣言

"use client" は「この関数をブラウザで動かす」という意味ではなく、ここから先はブラウザ側という境目を引く宣言です。宣言したファイルが import しているファイルも、まとめてブラウザ側に入ります。

プレーンテキスト

app/items/page.tsx サーバー └ CartButton.tsx "use client" ← ここが境目 └ formatPrice.ts ブラウザ側に入る

だから、置く場所を間違えると効き目が大きく変わります。ページの先頭に書けば、そのページの中身が丸ごとブラウザ側になります。これは第4章の後半で扱う「境界の設計」の話につながります。

忘れるとどうなるか

本物の Next.js では、useState を使う部品に "use client" を書き忘れると、その場でエラーになって画面が出ません。学習用のプレビューはサーバーを持たないので、書き忘れても動いてしまいます。画面が出たからといって、正しく宣言できているとは限りません。この章の演習では、書いたコードの中身も採点の対象にしています。

演習

カートボタンをブラウザ側の部品にして、押した数を数えます。

ヒント

1行目は "use client"; です。import よりも上に書きます

import { useState } from "react"; を書き忘れると動きません

onClick={() => setCount(count + 1)} で1つ増やします

CartButton.tsx
ItemList.tsx
data.ts
page.tsx
layout.tsx
プレビュー

できているか

  • サーバー側の一覧はそのまま出ている
  • カートに追加のボタンがある
  • 最初は0点と出ている
  • 押すたびにカートの数が増える
  • 状態を持つ部品をクライアントだと宣言している
  • useState で押された回数を持っている
  • 表示だけの一覧部品はサーバーのままにしている
  • ページ全体をクライアントにしていない
エディタを読み込んでいます