前提・実現したいこと
Reactで作成しているアプリにお問い合わせフォームを設けています。
下記がサンプルです。
サンプル
送信ボタンはデフォルトでdisabled状態です。
用意したすべてのフォームに有効な値が入力されたら、送信ボタンのdisabledを解除し、送信ボタンを押せるようにしたいです。
該当のソースコード
jsx
1import React, { useState } from "react"; 2 3export default function App() { 4 const [forms, setForms] = useState([false, false, false]); 5 console.log(forms); 6 7 const checkName = e => { 8 if (e.target.value === "") { 9 setForms((forms[0] = false)); 10 console.log(forms); 11 return; 12 } 13 setForms((forms[0] = true)); 14 console.log(forms); 15 }; 16 const checkMail = e => { 17 if (e.target.value === "") { 18 setForms((forms[1] = false)); 19 return; 20 } 21 setForms((forms[1] = true)); 22 }; 23 const checkMessage = e => { 24 if (e.target.value === "") { 25 setForms((forms[2] = false)); 26 return; 27 } 28 setForms((forms[2] = true)); 29 }; 30 31 const send = () => { 32 alert("送信しました。"); 33 }; 34 35 return ( 36 <form> 37 <p> 38 お名前 39 <input type="text" onChange={checkName} /> 40 </p> 41 <p> 42 メールアドレス 43 <input type="email" onChange={checkMail} /> 44 </p> 45 <p> 46 お問い合わせ内容 47 <input type="text" onChange={checkMessage} /> 48 </p> 49 <button onClick={send} disabled={forms !== [true, true, true]}> 50 送信 51 </button> 52 </form> 53 ); 54} 55
発生している問題
すべてのフォームに値を入力しても、送信ボタンのdisabledの解除ができていません。
送信ボタンの状態を下記のようにstateで管理しており、
jsx
1const [forms, setForms] = useState([false, false, false]);
formsが[true,true,true]になったら、送信ボタンのdisabledを解除するようにしています。
jsx
1<button onClick={send} disabled={forms !== [true, true, true]}>
setStateは各種フォームにonChangeイベントを用意し、「入力値があるか無いか」を条件に、booleanをforms配列に代入しています。
しかし、試しにお名前フォームに値を入力すると、
console
1[true, false, false] 2true
が一度にコンソールに表示されます。
※コンソールの一番上の[false,false,false]はAppコンポーネント描画時に表示されるものです。
以降のonChangeイベントによるコンソールの結果は、配列ではなくbooleanのみです。
また、メールとお問い合わせ内容フォームに入力時のコンソールの結果は、初回からbooleanのみです。
私の用意したサンプルはonChangeイベントのたびにsetStateにより再レンダリングされているので、パフォーマンス性的に良くないかと存じます。
よりパフォーマンス性に優れ、よりシンプルに実装できる方法がありましたら、ご教示いただけますと幸いです。
「実現したいこと」が実現できればよいので、最初に提示したサンプルの目指す実装方法にこだわるつもりはありません。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/12 05:06
2020/01/12 05:42
2020/01/12 06:23
2020/01/12 06:31