zukucode
主にWEB関連の情報を技術メモとして発信しています。

React useStateでselectの選択値を取得する

Reactでプルダウンの選択値を扱うには、selectのvalueとonChangeを使用します。

DOMから取得するvalueは、数値の選択肢を表示していても文字列です。選択値をそのまま識別子として扱うのか、計算に使う数値へ変換するのかを決めてからstateの型を選ぶと、暗黙の型変換による誤りを避けられます。

選択値をstateへ保存する

PrefectureSelect.tsx
import { useState } from 'react';

export const PrefectureSelect = () => {
  const [prefecture, setPrefecture] = useState('');

  return (
    <div>
      <label htmlFor="prefecture">都道府県</label>
      <select
        id="prefecture"
        value={prefecture}
        onChange={(event) => setPrefecture(event.target.value)}
      >
        <option value="">選択してください</option>
        <option value="tokyo">東京都</option>
        <option value="osaka">大阪府</option>
        <option value="fukuoka">福岡県</option>
      </select>
      <p>選択値: {prefecture || '未選択'}</p>
    </div>
  );
};

初期値を空文字にして、同じ値を持つ案内用のoptionを用意しています。

配列からoptionを作る

const prefectures = [
  { value: 'tokyo', label: '東京都' },
  { value: 'osaka', label: '大阪府' },
  { value: 'fukuoka', label: '福岡県' },
];

<select value={prefecture} onChange={(event) => setPrefecture(event.target.value)}>
  <option value="">選択してください</option>
  {prefectures.map((item) => (
    <option key={item.value} value={item.value}>
      {item.label}
    </option>
  ))}
</select>

選択肢を配列にすると、APIの結果から選択肢を作る場合にも応用できます。

数値として使用する

event.target.valueは、optionの値が数字に見えても文字列です。

const [quantity, setQuantity] = useState(1);

<select
  value={quantity}
  onChange={(event) => setQuantity(Number(event.target.value))}
>
  <option value="1">1個</option>
  <option value="2">2個</option>
  <option value="3">3個</option>
</select>

数値として計算する場合はNumberで変換します。

selectのvalueには、いずれかのoptionと同じ値を指定します。APIから選択肢を取得する場合は、読み込み後に初期値が存在するか確認します。

文字列と数値の違いに注意すれば、selectもテキストボックスと同じようにstateで管理できます。


関連記事

  • TypeScript i18nextの動的な翻訳キーを抽出対象に含める

    i18nextでステータスに応じた文言を表示する場合、翻訳キーを動的に切り替えることがあります。ただし、実行時に正しく表示できることと、翻訳キーの抽出ツールが使用箇所を検出できることは別です。今回は、...


  • React useStateで入力フォームを作成する

    Reactでテキストボックスに入力した値を使用するには、useStateで値を保持します。今回は名前とメールアドレスを入力し、送信ボタンを押すと入力内容を表示するフォームを作成します。この例では入力値...


  • React useStateで一覧の追加と削除を行う

    Reactで一覧を表示するときは、配列をuseStateへ保存できます。今回は簡単な買い物リストを作り、項目の追加と削除を行います。配列のpushやspliceで既存のstateを直接変更するのではな...


  • React useRefで入力欄にフォーカスを当てる

    入力フォームを開いた直後や、入力エラーが出たときに、特定の入力欄へフォーカスしたいことがあります。DOMの要素自体を参照するにはuseRefを使います。currentは初回描画中などにnullになり得...


  • React useMemoで重い計算結果を再利用する

    一覧の絞り込みや並べ替えを描画のたびに行うと、データ量や計算内容によっては画面操作が遅くなります。useMemoは、依存する値が変わらない間、以前の計算結果を再利用します。productsまたはque...


  • React useEffectで無限ループが発生するときに確認すること

    ReactのuseEffectを利用したときに無限ループが発生してしまうことがあります。特に注意したいのが、ESLintのreact-hooks/exhaustive-depsで表示された警告をUpd...


  • React useEffectの後片付けでイベント登録を解除する

    画面の幅が変わったときに表示を更新したい場合、ブラウザのresizeイベントを登録できます。登録したままにすると、コンポーネントが不要になったあとも処理が残るため、useEffectの後片付けを用意し...


  • React 関数コンポーネントにプロパティを設定する

    React+TypeScriptで作成した関数コンポーネントにプロパティを設定する方法を紹介します。以下は送信ボタンのコンポーネントを作成しています。isSubmittingというプロパティを用意して...


  • Reactで兄弟コンポーネントの状態を共有する

    検索欄に入力した文字列を、別の一覧コンポーネントでも使いたい場合があります。兄弟同士で別々にstateを持つと値がずれるため、共通の親にstateを置きます。入力欄は値を受け取り、変更を親へ通知します...


  • React react-router-domの基本的な使い方

    React+TypeScriptのプロジェクトにreact-router-domを導入してSPAのアプリケーションを作成する方法を紹介します。まずはreact-router-domのパッケージをインス...