こんにちは。Reactの世界へようこそ。
フロントエンドの荒波を渡り歩いてきた身として、今日はお話ししたいことがあります。
Reactを学び始めると、必ずと言っていいほど「`useEffect`」という不思議な道具に出会いますよね。「ここでAPIからデータを取ってきて…」「ボタンを押した後にこの処理をして…」なんて、魔法のように画面を動かすための必須アイテムです。
しかし最近、Reactの世界には「React Server Components(RSC)」という新しい風が吹き込んでいます。そして、この新しい仕組みでは、なんと「`useEffect`」が使えないのです。
「えっ、じゃあどうやって動かすの?」と不安に思った方、大丈夫です。今日はこの「なぜ使えないのか」、そして「どう考え方を変えればいいのか」を、お買い物の流れに例えて紐解いていきましょう。
—
1. 「useEffect」は、いわば「店員さんの気配り」
まず、`useEffect`が何をしているのかを、レストランで例えてみましょう。
- サーバーコンポーネント: 注文を受けたキッチン(サーバー)で、料理(データ)を完璧に作り上げて提供する専門家。
- クライアントコンポーネント(useEffect): お客さんのテーブルの横で、「お水が減ったら注ぐ」「メニューを落としたら拾う」といった、「お客さん(ブラウザ)の動きに合わせてその場で対応するホールスタッフ」です。
これまで私たちは、「キッチンで料理を作る」ことと「ホールで接客する」ことを、同じReactのコンポーネントという場所で混ぜて書いていました。しかし、これだとキッチン(サーバー)で接客をしようとしてエラーになったり、逆にホールでお皿を焼こうとして火傷したりと、混乱が起きていたんです。
React Server Componentsは、「キッチンはキッチン、ホールはホールで完全に役割を分けようぜ!」という、非常に合理的でクリーンな方針なのです。
—
2. なぜサーバーコンポーネントではuseEffectが使えないの?
答えはシンプルです。「サーバーには『ブラウザの画面』が存在しないから」です。
`useEffect`は、「ブラウザに画面が表示された後に、何かをする」という仕組みです。でも、サーバーはあくまで「HTMLの設計図」を書いている場所。そこにブラウザの画面はまだありません。
もしサーバーサイドで「画面が表示されたら…」なんて処理を書こうとしたら、存在しないものに話しかけるようなもの。だからReactは「ここではそんなことできないよ!」と教えてくれているんですね。
—
3. じゃあ、データ取得はどうすればいいの?
これまでのように「コンポーネントを読み込んだら、`useEffect`の中で`fetch`してデータを取ってくる」必要は、もうありません。
サーバーコンポーネントでは、直接データを取ってくることができます。まるで、「注文を受けた瞬間に、キッチンで材料を冷蔵庫から取り出す」ような感覚です。
比較してみましょう
昔のやり方(useEffectを使う)
// クライアント側で「表示された後に」データを取得する
function UserList() {
const [users, setUsers] = useState([]);
useEffect(() => {
// 画面が表示された後、重い通信が始まる
fetch(‘/api/users’).then(res => res.json()).then(setUsers);
}, []);
return
;
}
今のやり方(サーバーコンポーネント)
// サーバー側でデータを取得し終わってから画面を作る
async function UserList() {
// サーバーの力で直接データを取る。useEffectは不要!
const users = await db.users.findMany();
return (
-
{users.map(user =>
- {user.name}
)}
);
}
どうでしょう。コードが驚くほどスッキリしましたよね。`useEffect`で「読み込み中(loading)」の管理をしたり、エラーの処理をしたりする泥臭い作業が、サーバーサイドのシンプルな処理に置き換わったのです。
—
4. 「どうしても副作用が必要なとき」はどうする?
「でも、ボタンを押した時のクリックイベントや、画面のスクロールに合わせた動きはどうするの?」という疑問が浮かぶはずです。
その場合は、「クライアントコンポーネント」を切り出すというテクニックを使います。
1. サーバーコンポーネント: データの取得と、基本的なHTMLの組み立てを担当。
2. クライアントコンポーネント: `useEffect`や`useState`が必要な「動きのある部分」だけを、別の部品として切り出して配置。
ファイルの一行目に `’use client’;` と書くことで、そこだけが「ホールスタッフ」として働いてくれるようになります。
—
最後に:怖がらなくて大丈夫です
Reactの進化は速く、新しい用語に圧倒されることもあるかもしれません。でも、本質は常に「ユーザーにどうやってスムーズに体験を届けるか」という一点にあります。
`useEffect`が使えない場所があるのは、決して制限ではなく、「より速く、より安全に動くためのガイドライン」だと捉えてみてください。
まずは「これはサーバーでできることかな? それともブラウザでしかできない(画面の動きが必要な)ことかな?」と、頭の中で少しだけ整理するクセをつけてみてください。その小さな一歩が、いつかあなたを素晴らしいフロントエンド・エンジニアへと導いてくれるはずです。
何かわからないことがあれば、いつでもまた聞きに来てくださいね。一緒に一歩ずつ、進んでいきましょう!

コメント