コース一覧
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分

境界をまたぐ合成

children は境界を越える

サーバーで取って、ブラウザに渡す

サーバー側の部品は、商品データを読むところまでできます。クライアント側の部品は、押されたことに反応できます。この2つをつなぐのが props です。

TypeScript (JSX)

export default function ItemRow({ item }: { item: Item }) { return ( <li> <p>{item.title}</p> <AddToCart title={item.title} /> </li> ); }

ItemRow はサーバーで動き、AddToCart はクライアントで動きます。境界をまたいで値が渡っているように見えますが、書き方は今までの props と1文字も変わりません。

渡せるものと渡せないもの

サーバーからクライアントへ渡せるのは、そのまま文字にできるものだけです。文字列、数値、真偽値、配列、素のオブジェクトは渡せます。渡せないのは関数です。サーバーで作った関数はブラウザには存在しないので、props に入れても届きません。

TypeScript (JSX)

<AddToCart onDone={() => save()} />

これはエラーになります。押されたときの処理は、クライアント側の部品の中に書きます。

children なら向きが逆でもよい

クライアント部品は、サーバー部品を import できません。import した時点で、その相手もブラウザ側に引きずり込まれるからです。それでも、クライアント部品の中にサーバー部品を置きたいことはあります。

そのときは children を使います。

TypeScript (JSX)

<ClientPanel> <ServerItemList /> </ClientPanel>

ClientPanel は中身が何かを知らないまま、受け取ったものを並べるだけです。ServerItemList はサーバーで組み立てられ、出来上がったものが渡されます。import は境界を越えないが、children は越えると覚えておくと迷いません。

演習

サーバーで読んだ商品名を、クライアント部品に props で渡します。

ヒント

props の型は type AddToCartProps = { title: string }; のように書きます

押されたかどうかは useState(false) で持てば足ります

サーバー側から渡せるのは文字や数だけです。関数は渡せません

AddToCart.tsx
ItemRow.tsx
data.ts
page.tsx
layout.tsx
プレビュー

できているか

  • サーバーで読んだ商品が4件並んでいる
  • 価格が出ている
  • ボタンに商品名が渡っている
  • 押す前の表示が出ている
  • 押すとその商品を追加したと出る
  • 状態を持つ部品をクライアントだと宣言している
  • サーバーのデータを props で渡している
  • 表示だけの ItemRow はサーバーのままにしている
  • データを読むページはサーバーのままにしている
  • データの置き場所をブラウザ側に引き込んでいない
エディタを読み込んでいます