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

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

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

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

React.js

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

Q&A

解決済

2回答

9782閲覧

Reactでtextareaの入力文字数を制限したい

whoiwhoi

総合スコア48

JavaScript

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

React.js

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

0グッド

0クリップ

投稿2021/07/23 00:25

前提・実現したいこと

textareaの文字数をカウントするコンポーネントを作成しています

デモ

textareaの文字数が10文字を超えたら、文字数のカウントしないのと、文字の入力を受け付けないようにしたいです。
10文字を超えない場合は、自由に増減できるようにしたいです。
また、改行はカウントしないようにしたいです。

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

10文字を超えても入力ができます。

該当のソースコード

javascript

1const [length, setLengh] = useState(0); 2const checkTextArea = (e) => 3 setLengh(e.target.value.replace(/\n/g, "").length); 4 5return ( 6 <> 7 <p>現在{length < 10 ? length : 10}文字 / 最大10文字</p> 8 <textarea onChange={checkTextArea}></textarea> 9 </> 10);

試したこと

textareaにmaxlength属性を設定することで入力制限ができましたが、改行が文字数にカウントされます。

また、下記のようにsetStateを文字数ではなく文字そのものにして、10文字を超えたらsetStateしない、というコードにしてみました。

javascript

1const [text, setText] = useState(0); 2const checkTextArea = (e) => { 3 if(text.replace(/\n/g, "").length > 10) return; 4 setText(e.target.value); 5} 6 7return ( 8 <> 9 <p>現在{text.replace(/\n/g, "").length}文字 / 最大10文字</p> 10 <textarea onChange={checkTextArea} value={text}></textarea> 11 </> 12);

これで10文字になったら入力ができなくなり、かつ文字数のカウントも10文字で止まりました。
しかし、10文字になったらsetStateできなくなるため、文字数を減らすことができなくなりました。
textareaのvalue属性を取り除けば、10文字になっても文字数を減らすことができますが、代わりに11文字以上を入力できてしまいます。

また、10文字を超えたらdisabled属性をtrueにするように書いてみたものの、10文字を超えるとdisabledがtrueになることで文字の入力ができなくなり、文字を減らすことができなくなりました。

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

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

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

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

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

guest

回答2

0

ベストアンサー

const checkTextArea = (e) => { if(text.replace(/\n/g, "").length > 10) return; setText(e.target.value); }

で現在の text についてチェックしていしまっているので

const checkTextArea = (e) => { const newText = e.target.value.replace(/\n/g, "") if (newText.length > 10) return; setText(newText); }

と変えるのはどうでしょうか?

投稿2021/07/23 01:25

anozon

総合スコア662

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

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

0

実装より前に、どのような動作がユーザーにとって使いやすいか考える必要があります。

  • 郵便番号のように、「何文字打てばいいのかが明らか」な入力フォームについては、maxlengthなど「指定文字を超えれば強制的に打てなくなる」形でそう問題はありません。
  • 一方、一般のフリー入力の場合は、「入力したものが強制的に消される」のが不便になる場合がありうるので、「入力フォーム自体には文字数制限を適用せず、送信ボタンを無効化してユーザーに対応させる」という作り方のほうがいい場合もありえます。

(「<textarea>なのに上限10文字」というシチュエーションがわからないので、一般的なコメントとなっています)

投稿2021/07/23 01:14

maisumakun

総合スコア146018

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

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

maisumakun

2021/07/23 01:16

技術的な面について言えば、Reactからフォームの中身を制御したい場合、「stateに入力内容を持たせる」のほぼ1択です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問