どちらに置くか
迷ったときの判断基準
部品ごとに "use client" を書くかどうかは、感覚で決めるものではありません。次の4つのどれか1つでも当てはまればクライアント、どれも当てはまらなければサーバーです。
- state を持つ —
useStateやuseReducerで値を持ち続ける - イベントを受け取る —
onClickやonChangeやonSubmitが付いている - ブラウザだけにあるものを使う —
windowdocumentlocalStorageなど - フックを使う —
useEffectや自作フック、useRouterのようなものも含む
上から順に見ていって、1つでも当たったらそこで打ち切ってクライアントにします。全部外れたらサーバーのままにします。
fleama で当てはめてみる
| 部品 | 当てはまるもの | 置き場所 |
|---|---|---|
| ItemCard | どれも無い | サーバー |
| ItemList | どれも無い | サーバー |
| SearchBox | state とイベント | クライアント |
| CartButton | イベント | クライアント |
| ThemeToggle | localStorage | クライアント |
表示するだけの部品はほとんどサーバーに残ります。ブラウザ側に移るのは、受講生が指で触る部分だけだと考えると、だいたい合っています。
迷いやすいところ
map で一覧を並べるのは state ではないので、サーバーのままで構いません。日付を整形する関数も、計算しているだけならサーバーで動きます。逆に、一見ただの表示に見えても new Date() の結果をそのまま出すものは、サーバーとブラウザで表示がずれることがあるので注意が要ります。
判断に迷ったら、まずサーバーのままにしてみて、動かなくなってからクライアントにするのが安全です。あとから足すのは簡単ですが、いちど広げた境界を戻すのは手間がかかります。
演習
判断基準を関数にして、部品を自動で仕分けます。