前提・実現したいこと
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になることで文字の入力ができなくなり、文字を減らすことができなくなりました。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。