Vueのinputでminlengthが効かない時

Vueを使ってinputのデータを加工していると発生しました。

入力データの加工をやめると動作するようになるのですが、問題解決にはつながらないので、patternを使うという方法をご紹介します。

何が問題だったか

私が試したinput要素には、他にもrequired、maxlengthを指定しており、minlengthだけがフォームの送信でチェックされずにハマってました。

requiredが効いているのにminlengthが効かないのは納得がいかず、いろいろと調べたところ理由が分かりましたので、忘れないうちに書いておきたいと思います。

  • 人間が入力しないと反応しない(データの加工をすると動作しない)
  • ブランクとは別扱い(requiredがないと未入力は通ってしまう)

対応方法

minlengthを使った方法については結局諦めて、patternを使った方法になります。

以下の例では、3文字以上6文字以下を許容するバリデーションの書き方です。

<input type="text" pattern="\w{3,6}">

ただ、そのまま使うとエラーメッセージが不親切なので、以下のメソッドと使って独自のメッセージを設定します。

e.target.setCustomValidity('3桁以上で入力をしてください。')

実はここでも注意点があり、チェックがうまくいっている時は空文字をセットする必要があります。

この挙動もわかっておらず、時間をとってしまいました。

e.target.setCustomValidity('') // チェックがうまくいったなら''でセットし直す

最後に

改めて、バリデーションというのはちゃんとやるのは難しいなと思いました。

もしVueを使っているのであれば、何かしらのライブラリを活用した方ずっと楽かと思います。

システム開発のご相談はお気軽に

要件定義から運用まで、お客様のビジネスに最適なシステムをご提案いたします。
まずはお気軽にご相談ください。

初回相談無料 お見積もり無料 土日対応
今月の見積もり受付、残り2社様です
お問い合わせ・ご相談
先月32件のご相談

お探しの情報は見つかりましたか?

ご不明な点やご相談したいことがございましたら、
お気軽にお問い合わせください。

無料相談 オンライン対応 営業電話なし
お問い合わせはこちら