絞り込みUI

絞り込みは state と filter の組み合わせ

カテゴリのボタンを押すと、その種類の作品だけが残る。よくある絞り込み UI です。React では2つの部品でできています。

1つ目は state です。いま選ばれているカテゴリを覚えます。2つ目は filter です。元の配列から、選ばれたカテゴリに合う作品だけを取り出します。

const [category, setCategory] = useState("all"); const shown = category === "all" ? works : works.filter((work) => work.category === category);

あとは shownmap で並べるだけです。ボタンを押すと category が変わり、コンポーネントがもう一度動いて shown が作り直され、画面が描き直されます。

絞り込んだ結果を state に入れない

ここが一番の分かれ道です。次のように、絞り込み後の配列まで state にしたくなります。

const [shownWorks, setShownWorks] = useState(works);

これはおすすめしません。作品を1件追加したときに worksshownWorks の両方を更新しなければならず、片方だけ直し忘れると画面と実データが食い違います。state は「元のデータ」と「選ばれているカテゴリ」の2つだけにして、表示するものは毎回そこから計算します。計算で出せるものを state にしないのが、React で状態を減らすいちばんの近道です。

押されているボタンを見せる

選択中のカテゴリは、ボタンの見た目でも伝えます。className を三項演算子で出し分ければ済みます。

<button className={category === "web" ? "filter-web is-active" : "filter-web"} onClick={() => setCategory("web")} > Web </button>

onClick に渡すのは関数です。onClick={setCategory("web")} と書くと、描いた瞬間に呼ばれて無限に更新が走ります。() => setCategory("web") のように関数で包むところは第5章のとおりです。

件数と0件の扱い

絞り込みを付けたら、表示中の件数も出します。shown.length を出すだけです。そして前のレッスンの空状態が効いてきます。カテゴリによっては0件になるので、そのときは「該当する作品がありません」を出します。

演習

カテゴリボタンで作品を絞り込みます。

ヒント

App.jsx
App.jsx
プレビュー

できているか

  • はじめは件数が 3 になっている
  • Web を押すと2件になる
  • ツールを押すと「買い物メモツール」だけが残る
  • すべてを押すと3件に戻る