不明点
ReactからCloud Firestoreにupdate(更新)する際、フォームに何かしら編集したら問題なく更新できるのですが、何もフォームをいじらずにsubmitすると、値が空になって更新されてしまいます。
理屈を仮定すると何もonChangeしてないからe
の引数に何も入らずsetNameのe.target.value
が自ずと空になるから空の値が更新されてしまうのかなと思いますが、この問題を解決する方法が全くわからず困っています。
onChangeしない場合、今入っている値をそのまま更新する方法はありますか?
jsx
1<h2>編集フォーム</h2> 2 <form onSubmit={handleEditFormSubmit}> 3 <input 4 type="text" 5 value={name !== '' ? name : createUser?.name || ''} 6 placeholder="ユーザー名" 7 onChange={(e) => setName(e.target.value)} 8 /> 9 10 <button type="submit">編集</button> 11 </form>
コード全文
jsx
1import { useState } from 'react'; 2import firebase, { db } from '../../Firebase'; 3import Styles from './css/User.module.css'; 4import { useForm } from 'react-hook-form'; 5import { useCollectionData } from 'react-firebase-hooks/firestore'; 6import { UserTypes } from '../../types/types'; 7 8export const User = () => { 9 const [name, setName] = useState(''); 10 const [pending, setPending] = useState(false); 11 const [submitted, setSubmitted] = useState(false); 12 const { register, formState: { errors }, handleSubmit } = useForm(); 13 14 const user = firebase.auth().currentUser; 15 let authId: string | undefined; 16 17 if (user != null) { 18 user.providerData.forEach(() => { 19 authId = user.uid; 20 }); 21 } 22 23 const OnSubmit = async () => { 24 setPending(true); 25 try { 26 await firebase.firestore().collection('users').add({ 27 authId, 28 name, 29 }); 30 setSubmitted(true); 31 } finally { 32 setPending(false); 33 } 34 }; 35 36 const [list, loading, error] = useCollectionData<UserTypes>(db.collection('users'), { idField: 'docId' }); 37 if (loading) return <div>Loading...</div>; 38 if (error) return <div>Error...</div>; 39 40 const createUser = list?.find((user) => user.authId === authId); 41 42 const handleEditFormSubmit = async (event: React.FormEvent) => { 43 event.preventDefault(); 44 setPending(true); 45 try { 46 if (createUser) { 47 await firebase.firestore().collection('users').doc(createUser.docId).update({ 48 name, 49 }); 50 setSubmitted(true); 51 window.location.reload(); 52 } 53 } catch (error) { 54 console.error('Error updating user:', error); 55 } finally { 56 setPending(false); 57 } 58 }; 59 60 return ( 61 <section className={Styles.user}> 62 {!createUser ? ( 63 <div> 64 <h2>登録フォーム</h2> 65 <form onSubmit={handleSubmit(OnSubmit)}> 66 <input 67 {...register('name', { required: true })} 68 value={name} 69 onChange={(e) => setName(e.target.value)} 70 placeholder="ユーザー名" 71 name="name" 72 /> 73 {errors.name?.type === 'required' && 'お名前が入力されていません'} 74 75 <button type="submit">登録</button> 76 {pending && 'Pending...'} 77 </form> 78 </div> 79 ) : ( 80 <div> 81 <h2>編集フォーム</h2> 82 <form onSubmit={handleEditFormSubmit}> 83 <input 84 type="text" 85 value={name !== '' ? name : createUser?.name || ''} 86 placeholder="ユーザー名" 87 onChange={(e) => setName(e.target.value)} 88 /> 89 90 <button type="submit">編集</button> 91 </form> 92 {submitted && <p>更新しました</p>} 93 </div> 94 )} 95 </section> 96 ); 97}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。