vue使用rules實(shí)現(xiàn)表單字段驗(yàn)證
vue中表單字段驗(yàn)證的寫法和方式有多種,本博客介紹三種較為常用的驗(yàn)證方式。
1. 寫在 data 中驗(yàn)證
表單內(nèi)容
<!-- 表單 --> <el-form ref="rulesForm" :rules="formRules" :model="rulesForm" label-width="200px"> <el-form-item label="用戶名稱:" prop="userName"> <el-input v-model="rulesForm.userName" style="width:300px" maxlength="50"/> </el-form-item> </el-form>
- <el-form>:代表這是一個(gè)表單
- <el-form> -> ref:表單被引用時(shí)的名稱,標(biāo)識(shí)
- <el-form> -> rules:表單驗(yàn)證規(guī)則
- <el-form> -> model:表單數(shù)據(jù)對(duì)象
- <el-form> -> label-width:表單域標(biāo)簽的寬度,作為 Form 直接子元素的 form-item 會(huì)繼承該值
- <el-form> -> <el-form-item>:表單中的每一項(xiàng)子元素
- <el-form-item> -> label:標(biāo)簽文本
- <el-form-item> -> prop:表單域 model 字段,在使用 validate、resetFields 方法的情況下,該屬性是必填的
- <el-input>:輸入框
- <el-input> -> v-model:綁定的表單數(shù)據(jù)對(duì)象屬性
- <el-input> -> style:行內(nèi)樣式
- <el-input> -> maxlength:最大字符長度限制
data 數(shù)據(jù)
data() { return { // 省略別的數(shù)據(jù)定義 ... // 表單驗(yàn)證 formRules: { userName: [ {required: true,message: "請(qǐng)輸入用戶名稱",trigger: "blur"} ] } } }
- formRules:與上文 '表單內(nèi)容' 中 <el-form> 表單的 :rules 屬性值相同
- userName:與上文 '表單內(nèi)容' 中 <el-form-item> 表單子元素的 prop 屬性值相同
- 驗(yàn)證內(nèi)容是:必填,失去焦點(diǎn)時(shí)驗(yàn)證,如果為空,提示信息為 '請(qǐng)輸入用戶名稱'
2. 寫在行內(nèi)
表單內(nèi)容
<!-- 表單 --> <el-form ref="rulesForm" :rules="formRules" :model="rulesForm" label-width="200px"> <el-form-item label="銀行名稱:" prop="accountName" :rules="[{required:true,message:'請(qǐng)輸入銀行名稱',trigger:'blur'}]"> <el-input v-model="rulesForm.accountName" style="width:300px" maxlength="50"/> </el-form-item> </el-form>
- <el-form-item> -> rules:和第一種方式表現(xiàn)的效果一致,只是寫法不一樣,這里不再贅述
data 數(shù)據(jù)沒有內(nèi)容
3. 引入外部定義的規(guī)則
表單內(nèi)容
<!-- 表單 --> <el-form ref="rulesForm" :rules="formRules" :model="rulesForm" label-width="200px"> <el-form-item label="銀行卡號(hào):" prop="accountNumber"> <el-input v-model="rulesForm.accountNumber" style="width:300px" maxlength="19"/> </el-form-item> </el-form>
表單內(nèi)容與第一種方式寫法一致,這里不再贅述
script 內(nèi)容
<script> // 引入了外部的驗(yàn)證規(guī)則 import { validateAccountNumber } from "@/utils/validate"; // 判斷銀行卡賬戶是否正確 const validatorAccountNumber = (rule, value, callback) => { if (!value) { return callback(new Error("請(qǐng)輸入賬戶信息")); } else { if (validateAccountNumber(value)) { callback(); } else { return callback(new Error('賬號(hào)格式不正確')) } } }; export default { data() { return { // 省略別的數(shù)據(jù)定義 ... // 表單驗(yàn)證 formRules: { accountNumber: [ {required: true,validator: validatorAccountNumber,trigger: "blur"} ] } } } } </script>
- import:先引入了外部的驗(yàn)證規(guī)則
- const:定義一個(gè)規(guī)則常量,常量名可變, '= (rule, value, callback) => {}' 為固定格式,value 入?yún)轵?yàn)證的字段值
- formRules -> accountNumber:表單驗(yàn)證中使用 validator 指定自定義校驗(yàn)規(guī)則常量名稱
validate.js
/* 銀行賬戶 */ export function validateAccountNumber(str) { const reg = /^([1-9]{1})(\d{14}|\d{18})$/ return reg.test(str) }
- 驗(yàn)證規(guī)則
以上都是在失去焦點(diǎn)時(shí)的驗(yàn)證,下面來分析一下如何在表單提交時(shí)驗(yàn)證
1. 表單的提交按鈕
<!-- 表單 --> <el-form ref="rulesForm" :rules="formRules" :model="rulesForm" label-width="200px"> <el-form-item> <el-button type="primary" @click="onSubmit('rulesForm')">保存</el-button> <el-button @click="cancel">取消</el-button> </el-form-item> </el-form>
- <el-button>:按鈕
- <el-button> -> type:按鈕類型
- <el-button> -> @click:按鈕點(diǎn)擊時(shí)觸發(fā)的事件,這里注意方法的入?yún)?'rulesForm',這里要與 <el-form> 表單的 rel 屬性值一致
2. methods 方法
methods: { // 保存 onSubmit(formName) { this.$refs[formName].validate(valid => { if (valid) { console.log("success submit!!"); }else{ console.log("error submit!!"); } }); }, // 取消 cancel() { } }
this.$refs[formName].validate:formName 就是傳入的 'rulesForm',與 <el-form> 表單的 rel 屬性值一致,這樣就指定好需要驗(yàn)證的表單了
完整示例代碼如下
1. rules.vue
<template> <div class="app-container"> <el-tabs v-model="activeName"> <el-tab-pane label="表單" name="rulesPane" @tab-click="handleClick"> <!-- 表單 --> <el-form ref="rulesForm" :rules="formRules" :model="rulesForm" label-width="200px"> <el-form-item label="用戶名稱:" prop="userName"> <el-input v-model="rulesForm.userName" style="width:300px" maxlength="50"/> </el-form-item> <el-form-item label="銀行名稱:" prop="accountName" :rules="[{required:true,message:'請(qǐng)輸入銀行名稱',trigger:'blur'}]"> <el-input v-model="rulesForm.accountName" style="width:300px" maxlength="50"/> </el-form-item> <el-form-item label="銀行卡號(hào):" prop="accountNumber"> <el-input v-model="rulesForm.accountNumber" style="width:300px" maxlength="50"/> </el-form-item> <el-form-item> <el-button type="primary" @click="onSubmit('rulesForm')">保存</el-button> <el-button @click="cancel">取消</el-button> </el-form-item> </el-form> </el-tab-pane> </el-tabs> </div> </template> <script> import { validateAccountNumber } from "@/utils/validate"; // 判斷銀行卡賬戶是否正確 const validatorAccountNumber = (rule, value, callback) => { if (!value) { return callback(new Error("請(qǐng)輸入賬戶信息")); } else { if (validateAccountNumber(value)) { callback(); } else { return callback(new Error('賬號(hào)格式不正確')) } } }; export default { name: "rules", data() { return { activeName: "rulesPane", defaultProps: { children: "children", label: "label" }, rulesForm: { }, // 表單驗(yàn)證 formRules: { userName: [ { required: true, message: "請(qǐng)輸入用戶名稱", trigger: "blur" } ], accountNumber: [ { required: true, validator: validatorAccountNumber, trigger: "blur" } ], } }; }, created() {}, mounted() {}, methods: { handleClick(tab) { }, // 取消 cancel() { }, // 保存 onSubmit(formName) { this.$refs[formName].validate(valid => { if (valid) { console.log("success submit!!"); } else { console.log("error submit!!"); return false; } }); } } }; </script> <style lang="scss"> </style>
2. validate.js
/* 銀行賬戶 */ export function validateAccountNumber(str) { const reg = /^([1-9]{1})(\d{14}|\d{18})$/ return reg.test(str) }
效果圖
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue3?+?Ant?Design?實(shí)現(xiàn)雙表頭表格的效果(橫向表頭+縱向表頭)
這篇文章主要介紹了vue3?+?Ant?Design?實(shí)現(xiàn)雙表頭表格(橫向表頭+縱向表頭),需要的朋友可以參考下2023-12-12vue實(shí)現(xiàn)滑動(dòng)切換效果(僅在手機(jī)模式下可用)
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)滑動(dòng)切換效果,僅在手機(jī)模式下可用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07vue form表單post請(qǐng)求結(jié)合Servlet實(shí)現(xiàn)文件上傳功能
這篇文章主要介紹了vue form表單post請(qǐng)求結(jié)合Servlet實(shí)現(xiàn)文件上傳功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01Vue中通過vue-router實(shí)現(xiàn)命名視圖的問題
這篇文章主要介紹了在Vue中通過vue-router實(shí)現(xiàn)命名視圖,本文給大家提到了vue-router的原理解析,給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04vue自定義指令實(shí)現(xiàn)元素滑動(dòng)移動(dòng)端適配及邊界處理
這篇文章主要為大家介紹了vue自定義指令實(shí)現(xiàn)元素滑動(dòng)移動(dòng)端適配及邊界處理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09vue3+elementui-plus實(shí)現(xiàn)一個(gè)接口上傳多個(gè)文件功能
這篇文章主要介紹了vue3+elementui-plus實(shí)現(xiàn)一個(gè)接口上傳多個(gè)文件,先使用element-plus寫好上傳組件,然后假設(shè)有個(gè)提交按鈕,點(diǎn)擊上傳文件請(qǐng)求接口,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07Vue源碼解析之?dāng)?shù)組變異的實(shí)現(xiàn)
這篇文章主要介紹了Vue源碼解析之?dāng)?shù)組變異的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12詳解Vue 2中的? initState 狀態(tài)初始化
這篇文章主要介紹了詳解Vue 2中的initState狀態(tài)初始化,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08關(guān)于vue3.0中的this.$router.replace({ path: ''/''})刷新無效果問題
這篇文章主要介紹了關(guān)于vue3.0中的this.$router.replace({ path: '/'})刷新無效果問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01