質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

0回答

684閲覧

React: 登録フォームで登録ボタンを一度押すと、一文字修正するごとにonSubmitが効き続けてしまう。

607842

総合スコア8

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/10/25 04:24

編集2021/10/25 05:12

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/10/25 19:05

{error && alert(error)} なので、error に値が設定されていれば毎回 alert が実行されますね。 あと、input タグの type に password-confirm なんてありましたっけ? また、name をそのままキーにしてるので、name='passwordConfirm' とすべきでは。
607842

2021/10/29 02:18

ありがとうございます!errorの値が変更された後に初期化できればいいのか...inputのtyoeでpassword-confirmはありませんでした。失礼いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問