つくる - フック化完了

画面のファイルから、通信と入力を追い出す

第4章の締めくくりです。新しいことは出てきません。ここまでの4つを使って、App.tsx を「見た目を組み立てるだけのファイル」にします。

  • useItems に取得をまとめる
  • useForm に入力をまとめる
  • フックのルールを守る
  • 戻り値に型を付ける

送信もフックの仕事にする

いまの App.tsx は、一覧の取得は useItems に任せているのに、出品の POST だけ自分で fetch を呼んでいます。これでは商品データを触る場所が2つに分かれたままです。同じデータを扱う処理は、同じフックに集めます。

export type UseItemsResult = { items: Item[]; loading: boolean; error: string | null; addItem: (input: NewItem) => Promise<void>; };

addItem の型は「NewItem を受け取って、終わったことだけを知らせる関数」という意味です。返す約束をしていないので、使う側は結果ではなく完了だけを待ちます。

送ったあとに、なぜ画面が変わるのか

addItem の中では、POST の返事を items の末尾に足します。

const made: Item = await res.json(); setItems((prev) => [...prev, made]);

サーバーが決めた id 付きの1件が返ってくるので、それをそのまま state に足します。state を書き換えるのはフックの中だけになり、App.tsx には setItems が1つも出てきません。

App.tsx に残るもの

残るのは、フックを呼ぶ2行と JSX だけです。

const { items, loading, error, addItem } = useItems(""); const { values, handleChange, reset } = useForm({ title: "", price: "" });

ここまで来ると、ロジックの層と見た目の層が分かれます。第5章から先で状態の共有や画面の分割をしても、この2つのフックはほとんど書き換えずに済みます。

演習

addItem と useForm を仕上げ、App.tsx から fetch と入力欄の state を無くします。

ヒント

App.tsx
mock-api.json
useForm.ts
useItems.ts
App.tsx
mock-api.json
useForm.ts
useItems.ts
プレビュー

できているか

  • 一覧が API から5件出ている
  • 出品するとリストに1件増える