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

React useStateでチェックボックスの値を取得する

Reactでチェックボックスの選択状態を扱うには、useStateへboolean型の値を保存します。

チェックボックスでは、event.target.valueではなくevent.target.checkedを使う点がテキスト入力との違いです。単独のオン・オフはboolean、複数候補からの選択は配列とし、画面で扱う状態に合わせて型を選びます。

選択状態を保存する

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

export const AgreementCheckbox = () => {
  const [agreed, setAgreed] = useState(false);

  return (
    <div>
      <label>
        <input
          type="checkbox"
          checked={agreed}
          onChange={(event) => setAgreed(event.target.checked)}
        />
        利用規約に同意する
      </label>
      <p>{agreed ? '同意済み' : '同意していません'}</p>
    </div>
  );
};

チェックボックスではvalueではなくcheckedを使用します。変更後の状態はevent.target.checkedから取得できます。

選択されるまでボタンを無効にする

<button type="button" disabled={!agreed}>
  次へ
</button>

agreedfalseの場合、!agreedtrueになるためボタンが無効になります。

複数のチェックボックスを扱う

複数の選択肢は、選択した値の配列として保持できます。

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

const categories = ['本', '食品', '日用品'];

export const CategoryCheckboxes = () => {
  const [selected, setSelected] = useState<string[]>([]);

  const handleChange = (category: string, checked: boolean) => {
    setSelected((current) => checked
      ? [...current, category]
      : current.filter((item) => item !== category)
    );
  };

  return (
    <fieldset>
      <legend>カテゴリ</legend>
      {categories.map((category) => (
        <label key={category}>
          <input
            type="checkbox"
            checked={selected.includes(category)}
            onChange={(event) => handleChange(category, event.target.checked)}
          />
          {category}
        </label>
      ))}
      <p>選択中: {selected.join('、') || 'なし'}</p>
    </fieldset>
  );
};

選択された場合は配列へ追加し、外された場合はfilterで取り除きます。

上記はチェック状態が変化したときだけ呼ばれる前提です。別の処理からも追加する場合は、includesで存在を確認します。

単独のチェックボックスはboolean、複数の選択肢は配列で管理すると分かりやすくなります。


関連記事

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

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


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

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


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

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


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

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


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

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


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

    Reactでプルダウンの選択値を扱うには、selectのvalueとonChangeを使用します。DOMから取得するvalueは、数値の選択肢を表示していても文字列です。選択値をそのまま識別子として扱...


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

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


  • react-router-dom ページごとにファイルを分割する

    react-router-domでシングルアプリケーションを作成していると、ページ数が増えるにしたがって作成されるjsファイルのファイルサイズもどんどん増えていきます。ページごとにファイルを分割し、そ...


  • react-router-domでプログラムから画面遷移を行う

    react-router-domでプログラムから画面遷移を行う方法を紹介します。history.psuh(遷移先URL)の形式で実行すると、画面遷移を行えます。historyはreact-router...


  • react-router-dom ログイン認証の仕組みを実装する

    React+react-router-dom+TypeScriptでログイン認証の仕組みを実装する方法を紹介します。以下の仕様で実装します。未ログイン時ログイン時まずはログインページとトップページのル...