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

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

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

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

Q&A

解決済

1回答

1093閲覧

Raectでinputの中の文字を更新する方法

21212121

総合スコア61

React.js

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

0グッド

0クリップ

投稿2020/04/22 11:55

編集2020/04/22 11:56

現在ReactとReduxでtodoアプリを作っているのですが、送信ボタンを押してもInputの中の文字が入力されたままとなっていて、困っております。
本来であれば、e.preventDefaultで中身を更新できるはずですが、onChangeイベントをすでに使っているので使用できませんでした。
他に対策はあるのでしょうか?

以下がコードとです。

import React, { Component } from "react"; import TextField from "@material-ui/core/TextField"; import Button from "@material-ui/core/Button"; import { connect } from "react-redux"; import * as actionTypes from "../../store/actions/actions"; class Form extends Component { render() { return ( <div> <form onSubmit={(e) => e.preventDefault()}> <TextField onChange={(e) => this.props.onChangeHandler(e.target.value)} ></TextField> <Button onClick={() => this.props.onStoreResult(this.props.value)} style={{ color: "black" }} > 送信 </Button> </form> <ul> {this.props.add.map((l) => ( <li key={l.id}>{l.value}</li> ))} </ul> </div> ); } } const mapStateToProps = (state) => { return { value: state.change.value, add: state.add.todo }; }; const mapDisptchToProps = (dispatch) => { return { onStoreResult: (v) => dispatch({ type: actionTypes.ADD, value: v }), onChangeHandler: (e) => dispatch({ type: actionTypes.CHANGE, value: e }) }; }; export default connect(mapStateToProps, mapDisptchToProps)(Form);

イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

e.preventDefault はフォームを送信しないだけで、中身をクリアしてくれるものではないと思います。

送信ボタンを押した時に TextField をクリアするには、TextField を制御コンポーネントにして (つまり、value を指定して)、Button の onClick でクリアする (または、reducer の actionTypes.ADD の処理で state.change.value の値をクリアする) 必要があります。
参考: フォーム – React

diff

1 <TextField 2+ value={this.props.value} 3 onChange={(e) => this.props.onChangeHandler(e.target.value)} 4 ></TextField> 5 <Button 6- onClick={() => this.props.onStoreResult(this.props.value)} 7+ onClick={() => { 8+ this.props.onChangeHandler(''); 9+ this.props.onStoreResult(this.props.value); 10+ }} 11 style={{ color: "black" }} 12 > 13 送信 14 </Button>

なお、個人的には TextField の入力内容をグローバルな state にする必要はないと思いますが、そこは趣味の問題ですね。
参考: ReduxにおけるGlobal stateとLocal stateの共存 - LIVESENSE ENGINEER BLOG

投稿2020/04/23 01:08

hoshi-takanori

総合スコア7895

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

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

21212121

2020/04/23 03:42

コードもわざわざ綺麗にしていただきありがとうございました。 今回が何かアウトプット作品をReduxで作りたかったので、グローバルStateでState管理しましたが、 ローカルStateでの管理の方が良さそうですね。 hoshiさんはどんな基準でState管理は分けておりますか?
hoshi-takanori

2020/04/23 03:47

グローバルな state にするのは、複数のコンポーネントで共有したかったり、SPA でその画面に戻ってきた時に値を取っておきたいもの (住所の入力などのややこしいフォームなど) でしょうか。
21212121

2020/04/24 04:15

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問