您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關怎么在Vue中實現表單驗證,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
Vue是一款友好的、多用途且高性能的JavaScript框架,使用vue可以創建可維護性和可測試性更強的代碼庫,Vue允許可以將一個網頁分割成可復用的組件,每個組件都包含屬于自己的HTML、CSS、JavaScript,以用來渲染網頁中相應的地方,所以越來越多的前端開發者使用vue。
<div> <h3>你好,請登錄</h3> <div> <form id="loginFrom"> <div> <label>郵箱</label> <input type="text" class="form-control" id="inputEmail3" placeholder="Email" v-model="email"> </div> </div> <div> <label>密碼</label> <input type="password" class="form-control" id="inputPassword3" placeholder="Password" v-model="password"> </div> <div> <button type="button" class="btn btn-default login" v-on:click="login()">登錄</button> </div> <div v-if="errorList.length > 0"> <div class="alert alert-danger" role="alert">{{errorList.join(';')}}</div> </div> </form> </div> </div> <script> var vm = new Vue({ el: '#loginFrom', data: { email: "", password: "", errorList: [] }, methods: { validate: function () { this.errorList = [] if (this.email == '') { this.errorList.push('請輸入郵箱'); } else { var reg = /^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/; if (!reg.test(this.email)) { this.errorList.push('請輸入有效的郵箱'); } } if (this.password == '') { this.errorList.push('請輸入密碼'); } else { if (this.password.length < 6) { this.errorList.push('密碼長度不得少于6位'); } } return this.errorList.length <= 0; }, login: function () { if (this.validate()) { alert('登錄成功'); } } } }); </script>
為了排除無關內容對大家的影響,寫這個例子的時候,博主排除了一切復雜的HTML結構和CSS樣式,經過簡單潤色以后,這個例子的效果展示如下,果然GUI滿足了人們顏控的一面,可讓這個世界高速運行的是CLI,Bootstrap是博主這種“全棧工程師”的最愛之一。這種驗證方式簡直是人類本能的反應,可這恰好是最糟糕的一個例子,因為這個代碼完全沒法復用,可以想象得到,如果再繼續增加針對密碼強度,譬如大小寫、數字等等的驗證,這個代碼會混亂成什么樣子,所以,這是最簡單的表單驗證,同樣是最糟糕的表單驗證。
基于jQuery的表單驗證
其實,如果不是因為老項目依賴jQuery,而新項目在某些地方又需要和老項目保持一致,有誰會喜歡在Vue的世界里使用jQuery呢?因為數據驅動和事件驅動,真的是兩種不同的思想,我就見過因為監聽不到某個事件而花費一整天時間的人……所以,這里使用jQuery的表單驗證插件jQuery Validation,目的只有一個,即實現博主對自己的承諾,做一個和老項目一模一樣的表單驗證。官方這個示例最大的問題是,它的檢驗邏輯擴展性比較差,后端同學對這個應該有所體會啦,譬如實際業務中常常有郵箱、手機號、非空、數字、正則等等的驗證規則,而后端常常采用基于Attribute的驗證或者是FluentValidation這樣的庫,所以,核心問題是,能不能定義相應的驗證規則。接下來,我們通過jQuery的表單驗證插件來實現驗證。
通常情況下,jQuery Validation支持面向控件和面向代碼兩種驗證方式。所謂面向控件,就是指在控件里添加類似required
、email
、range
等等的擴展屬性,jQuery Validation內置了十余種標準的驗證規則,基本可以滿足我們的日常使用。而面向代碼,就是通過JavaScript來定義驗證規則,這就非常符合Vue數據驅動的風格了,因為在JavaScript里一切皆是對象,而這些對象可以作為Vue中的數據來使用。自然而然地,在第一個示例的基礎上,我們可以非常容易地擴展出基于jQuery的表單驗證:
var vm = new Vue({ el:'#loginFrom', data:{ email:"", password:"", validators:{ rules: { email: { required: true, email: true }, password: { required: true, minlength: 6, } }, messages:{ email:{ required:"請輸入郵箱", email:"請輸入有效的郵箱" }, password:{ required:"請輸入密碼", minlength:"密碼長度不得少于6位" } } } }, mounted:function(){ $('#loginFrom').validate(this.validators); } });
對于當前表單loginFrom,其驗證規則為validators,它完全參照jQuery Validation
的API文檔而來,具體大家可以從jQuery Validation
的文檔來做進一步了解。這里唯一看起來不爽的就是#loginFrom
,因為它和整個Vue看起來格格不入。不過,像博主目前項目的處境,如果老項目里使用jQuery
來對表單進行驗證,而使用Vue開發的新項目要兼容老項目的設計風格,使用jQuery有什么不可以呢?不得不說,Vue作為一個漸進式的開發框架,真正照顧了各個"年齡"段的前端工程師。使用jQuery Validation
以后的表單驗證效果如下:
通過jQuery Validation
,我們或許能感覺到一點不一樣的地方,那就是表單驗證其實還是蠻有意思的哈。也許是因為我原本是一個無聊的人,所以看到一點新的東西就覺得有趣。就像我雖然在提交數據時在后端做了校驗,可犧牲的其實是整個前端的使用體驗。而如果在前端對數據進行校驗,是在輸入過程中校驗還是在輸入完成校驗,是通過表單自帶的提交功能還是自己發起一個AJAX請求,這里面的確是有非常多的細節支撐的。第一種方案不支持遠程校驗,這更加能說明校驗本身要考慮的不單單只有前端了,同理,有了前端的校驗,不代表后端可以不做校驗。前端時間有人在知乎上提問,大意是說前端該不該完全信任后端返回的數據,嚴格來說,我們不應該信任任何人提供的數據,而這就是校驗這件事情本身的意義。
基于Vue的表單驗證
OK,如果說前面的兩種校驗是因為我們有一點歷史包袱,那么,接下來,我們將嘗試采用更“現代化”的表單驗證方式。通過Vue文檔中關于數據校驗這一節的內容,我們了解到官方推薦的兩個表單驗證插件是vuelidate和VeeValidate,而實際上這篇博客中的第一個例子,就是由文檔中的例子演化而來。我個人比較喜歡后者,所以,下面我們將使用這個插件來完成第三個例子。首先 ,我們通過Vue-Cli
創建一個Vue項目,然后安裝下面vee-validate
和vue-i18n
兩個插件:
npm install vee-validate@2.0.0 --save npm install vue-i18n
注意到這里指定了版本號,這是因為最新的3.x超出了我這個新人的接受范圍,一句話,太難了!接下來,我們在入口文件main.js
中添加下面的代碼,目的是啟用這兩個插件:
import VueI18n from 'vue-i18n'; import VeeValidate from 'vee-validate'; import zh_CN from 'vee-validate/dist/locale/zh_CN' //啟用Vue國際化插件 Vue.use(VueI18n) //配置VeeValidate const i18n = new VueI18n({ locale: 'zh_CN', }) Vue.use(VeeValidate, { i18n, i18nRootKey: 'validation', dictionary: { zh_CN } });
接下來,編寫一個單文件組件LoginForm.vue
:
<!-- template of LoginForm --> <template> <div class="container"> <h3 class="text-center">你好,請登錄</h3> <div class="row"> <form class="form-horizontal col-md-offset-4 col-md-4" id="loginFrom"> <div class="form-group"> <label for="inputEmail3" class="col-sm-2 control-label">郵箱</label> <div class="col-sm-10"> <input type="text" class="form-control" id="email" name="email" placeholder="Email" v-model="email" v-validate="'required|email'" data-vv-as="郵箱"/> <p class="alert alert-danger" role="alert" v-show="errors.has('email')">{{ errors.first('email') }}</p> </div> </div> <div class="form-group" name="password" rules="required"> <label for="inputPassword3" class="col-sm-2 control-label">密碼</label> <div class="col-sm-10"> <input type="password" class="form-control" id="password" name="password" placeholder="Password" v-model="password" v-validate="'required|min:6'" data-vv-as="密碼"/> <p class="alert alert-danger" role="alert" v-show="errors.has('password')">{{ errors.first('password') }}</p> </div> </div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> <div class="checkbox"> <label> <input type="checkbox" />記住密碼 </label> </div> </div> </div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> <button type="button" class="btn btn-default login" v-on:click="login()">登錄</button> </div> </div> </form> </div> </div> </template> <!-- script of LoginForm --> <script> export default { name: "LoginForm", components: {}, data: () => ({ email: "", password: "" }), methods: { login: function() { } } }; </script> <!-- style of LoginForm --> <style scoped> .login { color: white; height: 38px; width: 300px; background-color: #2b669a; } </style>
可以看到,我們在關鍵的兩個input控件上添加了v-validate
和data-vv-as
這兩個屬性。比如我們這里需要驗證用戶輸入的郵箱是否合法、郵箱是否為空,那么我們就可以使用下面的語法:
<input type="text" class="form-control" id="email" name="email" placeholder="Email" v-model="email" v-validate="'required|email'" data-vv-as="郵箱"/> <p class="alert alert-danger" role="alert" v-show="errors.has('email')">{{ errors.first('email') }}</p>
這些語法在Vue中被稱為指令,而data-vv-as
則是HTML5中的一個特性,用來給提示信息中的字段起一個別名。實際上,這個插件里同樣內置了一批常見的校驗規則。當控件中的值不滿足校驗條件時,就會在errors
中產生錯誤信息,所以,我們根據錯誤信息中是否包含指定字段來決定要不要展示錯誤信息,這就是這個插件的作用。運行這個例子,我們會得到下面的結果。
既然提到這類表單驗證最難的地方在于擴展性,那么下面我們再來看看如何擴展一個新的校驗規則,這里以最常見的手機號校驗為例, 個人以為這是這個插件最為強大的地方:
Validator.extend('isMobile', { messages: { zh_CN: field => field + '必須是11位手機號碼' }, validate: value => { return value.length === 11 && /^((13|14|15|17|18)[0-9]{1}\d{8})$/.test(value) } })
以上就是怎么在Vue中實現表單驗證,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。