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

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

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

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

Q&A

解決済

1回答

583閲覧

[React]10文字以下のバリデーションが効かない/defaultValueが効かない

aiai8976

総合スコア112

React.js

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

0グッド

0クリップ

投稿2020/06/03 01:29

編集2020/06/03 01:29

前提・実現したいこと

Reactでテキストフィールドの文字列をバリデーションしたいと考えています。
ただ、10文字以上で保存ボタンをクリックできるようにしたいのですが、10文字ちょうどだとfalseの方になってしまいます。
また、defaultValueでテキストフィールドのテキストを管理しているのですが、保存時に''で初期化されず、そのままになってしまいす。
改善点がわかる方がいましたらコメントお願いします。

該当のソースコード

const [message, setMessage] = React.useState(''); const handleValidation = (e) => { setMessage(e.target.value); if (message.length < 10) { //10文字がこっちに入ってしまう setValidated(false); } else { setValidated(true); return; } }; const handleSubmit = () => { console.log(message);   // ローカルストレージに保存 setMessage(''); //これが効かない。保存をクリックしてもメッセージが書かれたまま } const button = validated ? ( <Button onClick={handleSubmit} color="primary"> 保存 </Button> ) : ( <Button disabled color="primary"> 保存 </Button> ); return ( ... <TextField id="outlined-multiline-static" label="Message" multiline rows={4} variant="outlined" onChange={handleValidation} defaultValue={message} />

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

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

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

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

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

guest

回答1

0

ベストアンサー

コード全体を見ないと何ともいえないところもありますが、とりあえず、以下のように修正してみるといかがでしょうか?

diff

1const handleValidation = (e) => { 2 setMessage(e.target.value); 3 4- if (message.length < 10) { //10文字がこっちに入ってしまう 5+ if (e.target.value.length < 10) { 6 setValidated(false); 7 } else { 8 setValidated(true); 9 return; 10 } 11 };

投稿2020/06/03 01:40

jun68ykt

総合スコア9058

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

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

aiai8976

2020/06/03 01:45

10文字で通るようになりました!ありがとうございます。 直前でmessageに入れているにも関わらず、e.target.value.lengthとの違いは何なのでしょうか。 また、defaultValue問題については改善点が見つかりますか?
jun68ykt

2020/06/03 01:54

コメントありがとうございます。 > 直前でmessageに入れているにも関わらず、e.target.value.lengthとの違いは何なのでしょうか。 > 直前でmessageに入れている からといって、それがすぐに state に保持されている message に反映されるわけではないからです。なので、e.target.value が 10文字で、setMessage(e.target.value); した直後の 行の message はまだ9文字以下なので意図通りにはならないです。 > defaultValue問題については改善点が見つかりますか? 以下のように、prop を defaultValue ではなく、単に value に修正すると、うまくいくのではと思います。 修正前 defaultValue={message} 修正後 value={message}
aiai8976

2020/06/03 02:00

messageについてよくわかりました! また、valueに直したところうまくいきました! 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問