コース一覧
Next.jsフルスタック:サーバー・データ取得・API
つくる - 部品の仕分け

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分

つくる - 部品の仕分け

一覧ページを、正しい配置で組み立てる

今日は新しいことを覚えません。第4章で決めた基準どおりに、fleama の商品一覧ページを最後まで組み立てます。

使う基準は1つだけです。state・イベント・ブラウザ API・フックのどれかがあればクライアント、無ければサーバー。 そして、クライアントにする範囲はできるだけ小さくします。

今日の配置

一覧ページは5つのファイルでできています。仕分けの答えは次のとおりです。

ファイル置き場所理由
app/items/page.tsxサーバー商品を読んで渡すだけ
app/items/ItemList.tsxサーバー受け取った配列を並べるだけ
app/items/ItemCard.tsxサーバー1件を表示するだけ
app/items/LikeButton.tsxクライアント押された数を持つ
app/items/CartButton.tsxクライアント押された数を持つ

クライアントになるのはボタン2つだけです。商品名も価格も、サーバーで組み立てられた状態でブラウザに届きます。

進め方

上から順に手を入れると、途中で画面が壊れて原因が分かりにくくなります。末端から先に直すのが安全です。

  1. LikeButton に "use client" と useState を入れて、単体で押せるようにする
  2. CartButton にも同じことをする
  3. ItemCard に価格と LikeButton を足す
  4. 画面全体を見て、一覧が5件出て、両方のボタンが動くことを確かめる

出来たかどうかの見分け方

このプレビューは "use client" を書き忘れても動いてしまいます。画面が動いたことは、正しく仕分けできた証拠になりません。書いたコードの中身も採点していますので、サーバーに残す3つのファイルには "use client" を書かないことを最後に確かめてください。

演習

商品一覧ページを、正しい配置で完成させます。

ヒント

先に LikeButton と CartButton を直してから、ItemCard に手を入れると崩れにくいです

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

ItemCard はカード1枚を表示するだけなので、サーバーのままで足ります

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

できているか

  • 商品カードが5件並んでいる
  • カードに価格が出ている
  • 各カードにいいねボタンがある
  • カートの数が最初は0点と出ている
  • いいねを押すと数が増える
  • カートに追加を押すと数が増える
  • いいねボタンをクライアントだと宣言している
  • カートボタンをクライアントだと宣言している
  • カードにいいねボタンを置いている
  • 表示だけのカードはサーバーのままにしている
  • 一覧部品はサーバーのままにしている
  • ページ全体をブラウザ側に巻き込んでいない
  • データの置き場所をブラウザ側に引き込んでいない
エディタを読み込んでいます