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

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

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

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

Q&A

解決済

1回答

2886閲覧

Reactの子要素でhandleSubmitが使えなくて困っています

k10a

総合スコア35

React.js

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

0グッド

0クリップ

投稿2020/01/17 01:00

編集2020/01/17 01:35

現在、Reactと、Reduxを使って情報を更新する機能を実装しています。

親要素の中で、handleSubmitを使った時にはちゃんと動いたのですが、子要素の中で実行しようとすると反応がありません。目的としては、下記コードのなかでonSubmit()を実行することになります。

src/components/ItemForm.js

JavaScript

1class ItemForm extends Component { 2 constructor(props) { 3 super(props); 4 } 5 6 componentDidMount() { 7 { id } = this.props; 8 this.props.fetchItem(id); 9 } 10 11 renderField = field => { 12 const { input } = field; 13 return ( 14 <label>アイテム</label> 15 <textarea {...input} placeholder={"内容を入力してください"} rows="6" /> 16 ); 17 }; 18 19 onSubmit = values => { 20 const { item } = this.props; 21 this.props.updateItem(item, values); 22 }; 23 24 render() { 25 const { handleSubmit, item, placeholder } = this.props; 26 return ( 27 <form 28 onSubmit={handleSubmit(this.onSubmit)} 29 > 30 <Field 31 label={title} 32 name="content" 33 value={item.content} 34 placeholder={placeholder} 35 component={this.renderField} 36 /> 37 <div className="formBtn"> 38 <button type="submit" className="btn btnPrimary"> 39 Save Changes 40 </button> 41 </div> 42 </form> 43 ); 44 } 45} 46 47const validate = values => { 48 const errors = {}; 49 if (!values.content) errors.content = "内容を入力してください"; 50 return errors; 51}; 52 53const mapDispatchToProps = { fetchItem, updateItem }; 54 55function mapStateToProps({ items }) { 56 return { 57 item: items, 58 initialValues: { 59 content: items.content 60 } 61 }; 62} 63 64export default connect( 65 mapStateToProps, 66 mapDispatchToProps 67)( 68 reduxForm({ validate, form: "itemForm", enableReinitialize: true })( 69 ItemForm 70 ) 71);

src/components/Item.js

class Item extends Component { constructor(props) { super(props); } render() { return ( <div> <div> <ItemForm id={1} /> <ItemForm id={2} /> </div> </div> ); } } export default Item;

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

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

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

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

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

guest

回答1

0

ベストアンサー

onSubmit={handleSubmit(this.onSubmit.bind(this))}と書くと、renderした時点でhandleSubmitを実行してしまいます。おそらくそれは本来やりたい挙動と違うのではないかと思います。

投稿2020/01/17 01:11

maisumakun

総合スコア145183

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

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

k10a

2020/01/17 01:36

ご回答いただきましてありがとうございます。 handleSubmit(this.onSubmit)で試してみたのですが同じように動きません。。正確に言うと、handleSubmit(this.onSubmit)で動かなかったので、handleSubmit(this.onSubmit.bind(this))で試してみた次第です。
k10a

2020/01/17 01:41

一旦、別の構成で考えてみることにします。ありがとうございます!
maisumakun

2020/01/17 01:42

どちらにしても、そこにhundleSubmit(と書いた時点で「即時実行」という意味になります。引数は何であっても関係ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問