LoginSignup
0
0

React,Typescript,styledを使って作成したオリジナルのチェックボックスでformを作る

Posted at

React,Typescript,styledを使って作成したオリジナルのチェックボックスでformを作る

開発環境

"react": "^18.2.0",
"typescript": "^5.2.2",
"vite": "^5.0.8"
"styled-components": "^6.1.3"
"@types/styled-components": "^5.1.34"

何故この記事を書こうと思ったのか。

前回作成した記事での、オリジナルのチェックボックスを使用して、フォームを作成しました。
前記事に記載しましたので、是非ご参照いただければと思います。
https://qiita.com/nuhaha_2023/items/682b51d235f73fa9fd37

ディレクトリの構成について

こちらをご参照願います。
https://qiita.com/nuhaha_2023/items/74ccf938bb8de4922c6d

成果物と作成した関数の紹介。

まずは今回作成した関数の紹介。
src直下の、utilsディレクトリ(カスタムフックではない関数の格納場所)を用意しました。


type ListItem = {
  id: string;
  label: string;
};

// 静的な値を設定するために使用。
// idとラベルを用意した配列を渡す。
// ラベルとしての日本語は、あくまでも表示するためだけのものなので、変更する値としてこの関数では扱わない。
export const createBoolArray = (items: ListItem[]): { [id: string]: boolean } => {
  const createVal =  items.reduce((acc, item) => {
    acc[item.id] = false;
    return acc;
  }, {} as { [id: string]: boolean });
  return createVal;
};

// 配列から、trueの値を持っているkey名を抽出、配列として返す
export const extractHaveTrue = (items: { [id: string]: boolean }) => {
  const extractVal = Object.keys(items).filter(key => items[key]);
  return extractVal;
};

formコンポーネントのソースコード


import React, { ChangeEvent, useState } from "react";
import MyCheckBox from "../atoms/MyCheckBox";
import { createBoolArray, extractHaveTrue } from "../../utils/convertForSend";

const Form = () => {
  const list = [
    { id: "male", label: "" },
    { id: "female", label: "" },
    { id: "other", label: "不明" },
  ];

  // createBoolArray 関数を使用して初期状態を設定
  const initialCheckBoxState = createBoolArray(list);
  const [gender, setGender] = useState(initialCheckBoxState);

  const handleChange = (e: ChangeEvent<HTMLInputElement>) => {
    const { id, checked } = e.target;
    setGender({ ...gender, [id]: checked });
  };

  const extractVal = extractHaveTrue(gender);

  const onSubmitButton = (e: React.FormEvent) => {
    e.preventDefault();
    console.log(gender);
    console.log(extractVal);
  };

  return (
    <form onSubmit={onSubmitButton}>
      {list.map((item) => (
        <MyCheckBox
          key={item.id}
          id={item.id}
          label={item.label}
          checked={gender[item.id]}
          onChange={handleChange}
        />
      ))}
      <button type="submit">送信</button>
    </form>
  );
};

export default Form;

実装の結果

スクリーン ショット 2024-01-05 に 17.49.00 午後.png

スクリーン ショット 2024-01-05 に 17.48.43 午後.png

##補足
なんでtrueだけ抜粋する必要が?と感じられる方もいらっしゃるかもしれません、
以前開発でAPIを取り扱った際に、選択状況の送信がすべてnumber[] (バックエンドでいうint型)での送信が必要だったからです。下記URLにて、numberをstringに変更する旨書いてあります!もし参考になりそうであればご覧ください。
https://qiita.com/nuhaha_2023/items/4bdc8168026ac3917017

感想

次回はラジオボタン作るぞー!!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0