公式
https://vuelidate.js.org/
これが一番しっくりくるなぁ。。正直Reactより使いやすい。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>title</title>
<!-- <link rel="stylesheet" href="sample.css"> -->
<!--[if lt IE 9]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<script src="http://css3-mediaqueries-js.googlecode.com/svn/trunk/css3-mediaqueries.js"></script>
<![endif]-->
<!-- <script src="sample.js"></script> -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" >
<!-- <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> -->
<!-- <script src="https://cdn.jsdelivr.net/npm/vue@3.2/dist/vue.global.js"></script> -->
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vuelidate@0.7.4/dist/validators.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vuelidate@0.7.4/dist/vuelidate.min.js"></script>
</head>
<body>
<div id="app" class="container mt-5">
<h2>{{title}}</h2>
<!-- <pre>{{ $v }}</pre> -->
<div class="row">
<div class="col-sm-8">
<form @submit.prevent="submitForm" action="/hoge">
<div class="form-group">
<label for="name">名前:</label>
<input type="name" class="form-control" id="name" v-model="name" @blur="$v.name.$touch()">
<div v-if="$v.name.$error">
<span v-if="!$v.name.required">名前が入力されていません。</span>
<span v-if="!$v.name.alphaNum">英数字で入力してください。</span>
<span v-if="!$v.name.minLength">5文字以上で入力してください。</span>
<span v-if="!$v.name.maxLength">10文字以下で入力してください。</span>
</div>
</div>
<div class="form-group">
<label for="age">年齢:</label>
<input type="age" class="form-control" id="age" v-model="age">
</div>
<div class="form-group">
<label for="email">メールアドレス:</label>
<input type="email" class="form-control" id="email" v-model="email" @blur="$v.name.$touch()">
<div v-if="$v.email.$error">
<span v-if="!$v.email.required">メールアドレスが入力されていません。</span>
<span v-if="!$v.email.email">メールアドレスの形式が正しくありません。</span>
</div>
</div>
<button type="submit" class="btn btn-info">送信</button>
<!-- <button :disabled="$v.$invalid" type="submit" class="btn btn-info">送信</button> -->
</form>
</div>
</div>
</div>
<script>
Vue.use(window.vuelidate.default);
const { required, email, maxLength, minLength, alphaNum } = window.validators;
const app = new Vue({
el: '#app',
data: {
title: '入力フォームバリデーション',
name: '',
age: '',
email: '',
},
validations: {
name: {
required,
alphaNum,
minLength: minLength(4),
maxLength: maxLength(10),
},
email: {
required,
email
}
},
methods: {
submitForm() {
this.$v.$touch();
if (this.$v.$invalid) {
console.log('バリデーションエラー');
} else {
console.log('submit');
}
}
}
});
</script>
</body>
</html>