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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

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

Q&A

0回答

1310閲覧

Reactにてmap関数でループ表示させているformのstate管理

fresh_fish

総合スコア20

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

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

0グッド

0クリップ

投稿2020/11/10 15:26

前提・実現したいこと

現在reactを使って動的に追加、削除ができるフォームを作成しております
map関数を使ってループでフォームを増減させるところまでは出来たのですが増減するフォーム一つ一つをstateで管理する方法が思いつきません
最終的にはstateで管理したパラメータでバリデーションを行いたいと思っております
良いアイデアを教えて頂けると助かります

該当のソースコード

import React from "react" import PropTypes from "prop-types" let count = 0 class BandCreate extends React.Component { constructor(props) { super(props); this.state = { forms: [0] }; this.handleAddForm = this.handleAddForm.bind(this) this.handleDeleteForm = this.handleDeleteForm.bind(this) } handleAddForm(e) { e.preventDefault() count++ let forms = this.state.forms forms.push(count) console.log(forms) this.setState({ forms: forms }) } handleDeleteForm(e) { e.preventDefault count-- let forms = this.state.forms forms.pop(); this.setState({ forms: forms }); } render() { return ( <form enctype="multipart/form-data" action="/bands" accept-charset="UTF-8" method="post"> <input type="hidden" name="authenticity_token" value={this.props.token}></input> <h3>皆が使いやすいようにバンド名は正式名称で入力してください</h3> <label>バンド名を入力</label> <input type="text" name="band[name]" /> <div className="field"> <label>画像</label> <input type="file" name="band[image]" id="band_image"/> </div> {this.state.forms.map((form) => <span key={form.toString()}> <div className="nested-fields"> <label>メンバー名</label> <select name={`band[relationships_attributes][${form}][user_id]`}> {this.props.collections.map(collection => <option key={collection[1].toString()} value={collection[1]}>{collection[0]}</option>)} </select> <label>パート</label> <select name={`band[relationships_attributes][${form}][part]`}> <option value="Vo1">Vo1</option> <option value="Vo2">Vo2</option> <option value="GtVo">GtVo</option> <option value="BaVo">BaVo</option> <option value="Gt1">Gt1</option> <option value="Gt2">Gt2</option> <option value="Ba">Ba</option> <option value="Dr">Dr</option> <option value="Key">Key</option> <option value="その他">その他</option> </select> <input value="false" type="hidden" name={`band[relationships_attributes][${form}][_destroy]`} /> </div> </span> )} < button type="button" disabled={count > 8} onClick={this.handleAddForm}>メンバーを追加</button> <button type="button" disabled={count < 1} onClick={this.handleDeleteForm}>メンバーを削除</button> <input type="submit" name="commit" value="確定する" data-confirm="本当によろしいですか?" className="btn btn-primary"> </input> </form> ); } } export default BandCreate

試したこと

他のページでは以下のソースコードのようにstateを管理していました
ループ表示させているとこのようにstateを管理するのは難しいのでしょうか

import React from "react" import PropTypes from "prop-types" class Confirmation extends React.Component { constructor(props) { super(props); this.state = { email: '', email_error: true, }; } handleEmailChange(event) { const inputValue = event.target.value; this.setState({ email: inputValue }); if (inputValue === '') { this.setState({ email_error: true, }); } else { this.setState({ email_error: false, }); } } render() { let emailErrorText; if (this.state.email_error) { emailErrorText = ( <div className="dynamic_error_message">※メールアドレスが入力されていません</div> ); } else { emailErrorText = ''; } return ( <form className="new_user" action="/users/confirmation" accept-charset="UTF-8" method="post"> <input type="hidden" name="authenticity_token" value={this.props.token} /> <div className="field"> <input value={this.state.email} onChange={(event) => { this.handleEmailChange(event) }} placeholder="メールアドレスを入力してください" className="form-control" type="email" name="user[email]"/> </div> {emailErrorText} <div className="action"> <input disabled={this.state.email_error} type="submit" name="commit" value="送信する" className="btn btn-lg btn-warning btn-block"/> </div> </form> ); } } export default Confirmation

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

├─ react-dom@17.0.1
├─ react-is@16.13.1
├─ react@17.0.1

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問