🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
React.js

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

Q&A

解決済

1回答

613閲覧

Reactで入れ子にしているStateを正常に変更できない

te_ff

総合スコア13

React.js

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

0グッド

0クリップ

投稿2021/03/29 08:04

前提・実現したいこと

Reactで動画を複数個登録できる動的フォームを作成しております。
Formは動的に追加できたのですが、Stateを正常に変更できません。
動的フォームではどのように入れ子にしているStateを変更すればいいのでしょうか?

発生している問題・エラーメッセージ

下記ソースコードでFlgを変更するとフォームが追加され、Stateの値が正常に入らない。

該当のソースコード

React.js

1export const VideoForm = (prop) => { 2 const initialVideoState = { 3 'video': '', 4 'valid_flg': false, 5 } 6 7 const [title, setTitle] = useState(""); 8 const [video, setVideo] = useState([initialVideoState]); 9 10 const handleSubmit = (e) => { 11 e.preventDefault(); 12 13 const formData = new FormData(); 14 formData.append('title', title); 15 formData.append('project', prop.projectId); 16 video.map(v => { 17 formData.append('video', v.video, v.video.name); 18 formData.append('valid_flg', v.valid_flg); 19 }) 20 21 // API通信 22 } 23 24 const AddForm = (e) => { 25 e.preventDefault(); 26 var newVideo = []; 27 video.map(v =>{ 28 newVideo.push(v); 29 }); 30 newVideo.push(initialVideoState); 31 console.log('追加イベント') 32 setVideo(newVideo); 33 } 34 35 // ここで正常に値が入らず、フォームが一つ追加される 36 const handleChange = (hogehoge, e) => { 37 e.preventDefault(); 38 var target = video.find(v => v===hogehoge); 39 40 setVideo([ 41 ...video, 42 video.find(v => v===hogehoge)['valid_flg'] = true 43 ]); 44 console.log(video); 45 } 46 47 return( 48 <> 49 <label> 50 タイトル: 51 <input type="text" name="title" value={ title } onChange={ (e) => setTitle(e.target.value) } /> 52 </label> 53 {video.map(v => 54 <div> 55 <label> 56 動画: 57 <input type="file" name="video" accept='video/*' alt="動画" /> 58 </label> 59 <label> 60 フラグ: 61 <input type="checkbox" name="valid_flg" onChange={ (e) => handleChange(v, e) } checked={v.valid_flg} /> 62 </label> 63 </div> 64 )} 65 </> 66 ) 67}

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

// ここで正常に値が入らず、フォームが一つ追加される

そうですね、setVideo([...video, 何か])では、もとのvideoに「何か」の項目を追加する、という意味になってしまいます。

投稿2021/03/29 08:11

編集2021/03/29 08:11
maisumakun

総合スコア145975

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

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

te_ff

2021/03/29 09:16

ありがとうございます。 var newVideo = [...video]; newVideo.find(v => v===hogehoge).valid_flg = e.target.checked; setVideo(newVideo); とすると解決できました。 リアルタイムで再描画されない問題が発生いたしましたが別問題なので一度こちらは解決済みとさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問