最近、素のHTMLやCSSをなるべく活用することに興味があります。
こういったベースの技術の方がフレームワークよりも息が長いので、一度学んだことを長期間役に立てることができるためです。
※もちろんフレームワークも使うときは使います。例えばNuxt.jsは大好きです。
今回は、HTML5のフォームバリデーション機能を、Nuxt.jsで構築したSPAの中で使ってみたいと思います。
#課題
HTML5のフォームバリデーションは、通常はformのsubmitを実行したタイミングで実施されます。
でも、SPAではformをsubmitしません。
どうしましょう...
#解決策
form.reportValidity() を使います。
これは、submitせずにバリデーションだけをかけるためのメソッドです。
※2020年7月時点のMDNによれば、IE以外の全ての主要ブラウザでサポートされているようです。安心して使えますね。
https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/reportValidity
#コード例
<template>
<form>
<label>
数量
</label>
<input
type="number"
v-model="quantity"
min="0"
max="999"
@chenge="onChengeInput"
/>
</form>
</template>
<script>
export default {
data() {
return {
unitprice: 0,
quantity: 0,
}
},
methods: {
onChangeInput(event){
this.$el.reportValidity()
},
},
}
</script>
#ポイント
この例では、直近のform要素を取得するために$el
を使っています。
$el
はVue.jsでルート要素を取得するためのプロパティです。
このサンプルコンポーネントでは、template直下のルート要素がformなので、それを一発で取得できています。
※コンポーネント内の要素の構造によっては、$refs
を用いて参照する方法もあると思います。