コース一覧
Reactで状態・フォーム・リストを扱う
絞り込みUI

Reactで状態・フォーム・リストを扱う

useState、イベントハンドラ、制御されたinput、フォーム送信とバリデーション、mapによるリスト表示、key、条件レンダリング、空状態を扱う全25レッスンのコースです。入力・絞り込み・ダークモードへ反応する作品ギャラリーを作り、ユーザー操作で変化するUIの基本を身につけます。

1
state(useState)
01. なぜstateが必要か15分
02. useState15分
03. ボタンで更新15分
04. 複数のstate15分
05. オブジェクトのstate15分
06. 配列のstate15分
07. 再レンダリングの仕組み10分
08. つくる - ダークモード切替20分
09. 第4章クイズ15分
2
イベントとフォーム
01. イベントハンドラ15分
02. イベントオブジェクト15分
03. 制御されたinput15分
04. 複数の入力15分
05. フォーム送信15分
06. バリデーション15分
07. つくる - 問い合わせフォーム20分
08. 第5章クイズ15分
3
リストと条件レンダリング
01. mapでリスト描画15分
02. key15分
03. 条件レンダリング(&&)15分
04. 出し分け(三項)15分
05. 空状態15分
06. 絞り込みUI15分
07. つくる - ギャラリーReact版20分
08. 第6章クイズ15分

絞り込みUI

絞ってから並べる

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

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

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

JavaScript (JSX)

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

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

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

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

JavaScript (JSX)

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

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

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

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

JavaScript (JSX)

<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件になるので、そのときは「該当する作品がありません」を出します。

演習

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

ヒント

shown は state にしません。category と works から毎回計算します

const shown = category === "all" ? works : works.filter((work) => work.category === category);

App.jsx
プレビュー

できているか

  • はじめは件数が 3 になっている
  • Web を押すと2件になる
  • ツールを押すと「買い物メモツール」だけが残る
  • すべてを押すと3件に戻る
エディタを読み込んでいます