こう 聞かれます
- 「フロントエンドの
状態は、 どう 分けて 持ちますか」 - 「サーバーから
取った データも、 全部 グローバルな 置き場に 入れますか」 - 「検索の
条件や ページの 番号は、 どこに 持たせますか」
面接官が 見ている点
- 状態を
種類で 分けて 考えられるか (全部を 1 つの 置き場に 集めない) - サーバーの
データは 「借りている写し」で、 キャッシュと 取り直しの 問題だ、 と分かっているか - URL に
持たせると、 共有や 再読み込みでも 同じ 画面に 戻れる、と言えるか - 道具の
名前より、 選ぶ理由を話せるか
短い答え
- 状態を、
サーバーから 来た データ、 画面の 一時的な 状態、 アプリ全体で 共有する 状態、 URL に 持たせられる 状態、の 4 つに 分けます。 - サーバーの
データは TanStack Query や SWR のような キャッシュと 取り直しの 道具に 任せ、 開閉や 入力中の 値は useState、 ログイン中の 利用者や 表示の テーマは Context や Zustand に 置きます。 - 検索の
条件や ページの 番号は URL に 持たせ、 共有や 再読み込みでも 同じ 画面に 戻れるようにします。 1 か所に 全部集めると、 要らない 描き直しと 古い データの 問題が 増えます。
少し 詳しい答え
4 つの 種類と置き場
| 種類 | 例 | 置き場 |
|---|---|---|
| サーバーのデータ | 商品の | TanStack Query、SWR |
| 画面の | モーダルの | useState |
| アプリ全体の状態 | ログイン中の | Context、Zustand |
| URL に | 検索の | URL (?q= の部分) |
サーバーの データは「写し」
サーバーから
TanStack Query や SWR は、
TypeScript (JSX)
const { data, isLoading, error } = useQuery({
queryKey: ["items", page],
queryFn: () => fetchItems(page),
});自分で useEffect と useState で
URL に持たせる
検索の?q=靴&page=2 のような
トレードオフ
何でも
小さな
話すときは、
よく ある間違い
- サーバーの
データを 全部 グローバルな 置き場に写す 取り直しや 古さの 管理を 全部 自分で 抱えます。 キャッシュの 道具に任せます - 検索の
条件を state だけに持つ共有も 再読み込みも できず、 戻る ボタンで 条件が消えます - 最初から
大きな 状態管理の 道具を入れる 小さい うちは useState と props で 足ります。 困りごとが 出てから足します
深掘りの問い
- 「フォームの
入力中の 値は、 どこに 持ちますか」 送るまでは その 画面だけの 一時的な 状態なので、 フォームの 部品の 中に 持つ、と答えます - 「保存した
あと、 一覧を 新しく するには」保存が 成功したら、 その 一覧の キャッシュを 古い 印に して 取り直す、と答えます - 「Context と Zustand は、
どう 使い 分けますか」 あまり 変わらない 値は Context、 頻繁に 変わり、 使う 部品ごとに 一部だけ読みたい値は Zustand のような 道具、と答えます