LoginSignup
1
0

More than 1 year has passed since last update.

【React】フォームの回答欄の数を可変にする

Last updated at Posted at 2021-12-07

概要

こんにちは!今日はフォームの回答欄の数を可変にする方法をお伝えします。
具体的にいうと「回答を追加するボタン」を押すと回答欄が増えて、「回答を削除するボタン」を押すと回答欄が減るフォームです!
useStateなどreactの基本的な内容が分かっている人は、簡単に実装できると思います〜

手順

1.numOfFormを定義する。

(例)

const [numOfForm, setNumOfForm] = useState(1);

このようにuseStateを用いて初期値が1のstateを作成します。
これが最初の回答欄の数になります。

2.inputsを定義する。

(例)

const inputs = Array(numOfForm).fill(null);

ここに入力されたデータを入れていくことになります。
すなわち最終的にユーザに入力してもらったデータはinputsに入ります!

3.HTML(JSX)の記述

(例)

return(
...
{Array(numOfForm)
            .fill(null)
            .map((_, i) => (
                    <input
                      key={i}
                      value={inputs[i]}
                      required={true}
                      onChange={(e) => inputs.splice(i, 1, e.target.value)}
                    />
))}
...
)

上記のようにして、map関数やfill関数を用いて、記述していきます。
まずnumOfFormの数だけnullが入っている配列を作成します。それにmapを適用してinputをnumOfFormの数だけ作っていきます。

4.addAnswer,deleteAnswerを定義

(例)

const addAnswer = () => {
    setNumOfForm(numOfForm + 1);
  };
  const deleteAnswer = () => {
    if (numOfForm === 1) {
      console.log("これ以上回答は削除できません");
    } else {
      setNumOfForm(numOfForm - 1);
    }
  };

このようにしてaddAnsewerではnumOfFormの数を増やし、deleteAnswerではnumOfFormの数を減らします。delteAnswerでは、numOfFormの数が0以下にならないようにif文を記述しています。

5.フォームを増やすボタンの作成

(例)

return(
...
<Button onClick={addAnswer}>回答を追加</Button>
<Button onClick={deleteAnswer}>回答を削除</Button>
...
)

これによりaddAnswerとdeleteAnswer関数が呼び出されるようになります。またnumOfFormはstateで管理しているため、numOfFormの値がsetされるたびに、JSXの再描画が行われます。これによりボタンを押すたびに、ページの見た目がしっかりと変わってくれます。

余談

今回はフォームの回答欄が可変になるようにしました!
やや、mapやfillを使っているところが複雑ですが、ゆっくり読んでみてください!
自分は複数回答のクイズのフォームに使用しました。

1
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
1
0