Vue.js - 表單驗證實作

前言

最近覺得Vue還蠻好玩的,剛好我需要挑一個前端框架來玩玩,所以就挑這個囉!

實作說明

整體流程

我要用Vue來監控Form所有的值,使用Regular Expression(正規表達式)來驗證是否錯誤,錯誤提示的部分使用Bootstrap 4

簡單範例

HTML部分建立一個input 數值使用v-model綁在data上,v-bind:class則是顯示錯誤的開關 在建立一個invalid-feedback的div,裡面用來放錯誤訊息

1
2
3
4
5
6
<label for="username">帳號</label>
<input type="text" class="form-control" name="username" v-bind:class="{ 'is-invalid': usernameError }" v-model="username"
    placeholder="Username">(最多10個字)
<div class="invalid-feedback">
    {{ userErrMsg }}
</div>

Vue部分 創建3個Data username用來繫結輸入的值、usernameError用來控制是否錯誤、userErrMsg用來控制錯誤訊息 使用Vue的watch事件用正規表達式檢查是否錯誤

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var app = new Vue({
    el: '#app',
    data: {
        username: '',
        usernameError: false,
        userErrMsg: ''
    },
    watch: {
        username: function () {
            var isText = /^[a-zA-Z0-9]+$/;
            if (!isText.test(this.username)) {
                this.usernameError = true;
                this.userErrMsg = '請勿包含特殊字元';
            }
            else if (this.username.length > 10) {
                this.usernameError = true;
                this.userErrMsg = '請勿超過10個字';
            }
            else {
                this.usernameError = false;
            }
        }
    }
});

完整實作範例

HTML部分

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<div id="app">
    <div class="row">
        <div class="form-group">
            <label for="username">帳號</label>
            <input type="text" class="form-control" name="username" v-bind:class="{ 'is-invalid': usernameError }" v-model="username"
                placeholder="Username">(最多10個字)
            <div class="invalid-feedback">
                {{ userErrMsg }}
            </div>
        </div>
    </div>
    <div class="row">
        <div class="form-group">
            <label for="">密碼</label>
            <input type="text" class="form-control" name="password" v-bind:class="{ 'is-invalid': passwordError }" v-model="password"
                placeholder="Password">(至少6位,小於15位,必須包含大小寫和數字)
            <div class="invalid-feedback">
                {{ passErrMsg }}
            </div>
        </div>
    </div>
    <div class="row">
        <div class="form-group">
            <label for="">E-Mail</label>
            <input type="text" class="form-control" name="email" v-bind:class="{ 'is-invalid': emailError }" v-model="email" placeholder="Email">
            <div class="invalid-feedback">
                {{ emailErrMsg }}
            </div>
        </div>
    </div>
</div>

JS部分

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
var app = new Vue({
    el: '#app',
    data: {
        username: '',
        usernameError: false,
        userErrMsg: '',
        password: '',
        passwordError: false,
        passErrMsg: '',
        email: '',
        emailError: false,
        emailErrMsg: ''
    },
    watch: {
        username: function () {
            var isText = /^[a-zA-Z0-9]+$/;
            if (!isText.test(this.username)) {
                this.usernameError = true;
                this.userErrMsg = '請勿包含特殊字元';
            }
            else if (this.username.length > 10) {
                this.usernameError = true;
                this.userErrMsg = '請勿超過10個字';
            }
            else {
                this.usernameError = false;
            }
        },
        password: function () {
            var isText = /^[a-zA-Z0-9]+$/;
            var inclde = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,15}$/;

            if (!isText.test(this.password)) {
                this.passwordError = true;
                this.passErrMsg = '請勿包含特殊字元';
            }
            else if (this.password.length < 6) {
                this.passwordError = true;
                this.passErrMsg = '請勿少於6個字';
            }
            else if (this.password.length > 15) {
                this.passwordError = true;
                this.passErrMsg = '請勿超過15個字';
            }
            else if (!include.test(this.password)) {
                this.passwordError = true;
                this.passErrMsg = '至少包括一個大小寫字母或數字';
            }
            else {
                this.passwordError = false;
            }
        },
        email: function () {
            var isMail = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z]+$/;
            if (!isMail.test(this.email)) {
                this.emailError = true;
                this.emailErrMsg = 'email格式錯誤';
            }
            else {
                this.emailError = false;
            }
        }
    }
});

後記

表單驗證使用Vue.js之後做起來方便多了,驗證的非常及時,跟Bootstrap搭配起來也非常方便,只要監控的數值改變,Vue.js便會重新渲染,相較自己寫JS按下Submit才檢查來得更即時。

comments powered by Disqus
使用 Hugo 建立
主題 StackJimmy 設計