Reactで、フォームのパスワードと確認用パスワードが違った状態でSubmitボタンを押したあとアラートを表示されているのですが、その後一文字修正するごとに’パスワードが合っていません’とエラーが起こります。useEffectやuseCallbackを追加しても意味がないということは勉強してわかったのですが、一度onSubmitが押されるとonSubmitが効き続けている状態になっているのではないかと疑っています。一体、どこの箇所を修正すればいいでしょうか?
RegisterForm.tsx
tsx
1import React, { useState, FormEvent, useRef } from 'react' 2import RegisterImage from '../images/development.svg' 3import Button from '../components/Button' 4import { useHistory } from 'react-router-dom' 5import { useAuth } from '../contexts/AuthContext' 6import { API } from 'aws-amplify' 7 8 9const startingUser = { 10 name: '', 11 shop: '', 12 email: '', 13 password: '', 14 passwordConfirm: '', 15 tel: '' 16} 17 18const RegisterForm: React.FC = () => { 19 20 const [details, setDetails] = useState({ ...startingUser }) 21 const { signup } = useAuth() 22 const [error, setError] = useState('') 23 const [loading, setLoading] = useState(false) 24 const history = useHistory() 25 26 27 const changeHandler = (e: React.ChangeEvent<HTMLInputElement>) => { 28 const { name, value } = e.target 29 setDetails(prevState => ({ 30 ...prevState, 31 [name]: value 32 })) 33 } 34 35 const submitHandler = async (e: FormEvent) => { 36 e.preventDefault() 37 if (details.password !== details.passwordConfirm) { 38 return setError(`password doesn't match`) 39 } 40 try { 41 setError('') 42 setLoading(true) 43 await signup(details.email, details.password) 44 await createUser({ ...details }) 45 history.push('./userPage') 46 } catch (e) { 47 48 setError('account failed') 49 } 50 setLoading(false) 51 } 52 53 const clickHandler = () => { history.goBack() } 54 55 async function createUser(user) { 56 return API.post('users', '/users', { 57 body: user 58 }) 59 } 60 61 return ( 62 <div> 63 <div> 64 <div> 65 {error && alert(error)} 66 <form onSubmit={submitHandler} > 67 <div > 68 <h2>Sign up</h2> 69 <div > 70 <label htmlFor='name'>user name</label> 71 <input type='text' name='name' required onChange={changeHandler} value={details.name} /> 72 </div> 73 <div> 74 <label htmlFor='tel'>tel</label> 75 <input type='tel' name='tel' onChange={changeHandler} value={details.tel} /> 76 </div> 77 <div> 78 <label htmlFor='email'>email</label> 79 <input type='email' name='email' required onChange={changeHandler} value={details.email} 80 /> 81 </div> 82 <div> 83 <label htmlFor='password'>password</label> 84 <input type='password' required name='password' 85 onChange={changeHandler} 86 /> 87 </div> 88 <div> 89 <label htmlFor='password-confirm'>passwordConfirm</label> 90 <input type='password-confirm' name='password-confirm' required 91 onChange={changeHandler} 92 /> 93 </div> 94 <div> 95 <input type='submit' disabled={loading} value='register' 96 /> 97 </div> 98 </div> 99 </form> 100 </div> 101 </div> 102 <div> 103 <Button color='green' clickHandler={clickHandler}>Go back</Button> 104 </div> 105 </div> 106 ) 107} 108 109export default RegisterForm 110
あなたの回答
tips
プレビュー