在vue中使用rules對(duì)表單字段進(jì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:最大字符長(zhǎng)度限制
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)
}效果圖

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue3+ts+vite2項(xiàng)目實(shí)戰(zhàn)踩坑記錄
最近嘗試上手Vue3+TS+Vite,對(duì)比起Vue2有些不適應(yīng),但還是真香,下面這篇文章主要給大家介紹了關(guān)于vue3+ts+vite2項(xiàng)目的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
如何使用vue-json-viewer插件展示JSON格式數(shù)據(jù)
這篇文章主要給大家介紹了關(guān)于如何使用vue-json-viewer插件展示JSON格式數(shù)據(jù)的相關(guān)資料,Vue-json-viewer是一個(gè)Vue組件,用于在Vue應(yīng)用中顯示JSON數(shù)據(jù)的可視化工具,需要的朋友可以參考下2023-11-11
vue better scroll 無法滾動(dòng)的解決方法
better scroll可以實(shí)現(xiàn)輪播圖和頁(yè)面滾動(dòng),是移動(dòng)端滾動(dòng)插件,這篇文章主要介紹了vue better scroll 無法滾動(dòng)的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
VUE前端從后臺(tái)請(qǐng)求過來的數(shù)據(jù)進(jìn)行轉(zhuǎn)換數(shù)據(jù)結(jié)構(gòu)操作
VUE前端從后臺(tái)請(qǐng)求過來的數(shù)據(jù)進(jìn)行轉(zhuǎn)換數(shù)據(jù)結(jié)構(gòu)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11
解決el-menu標(biāo)題過長(zhǎng)顯示不全問題
本文主要介紹了如何解決el-menu標(biāo)題過長(zhǎng)顯示不全問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,感興趣的朋友們跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-12-12
vue 折疊展示多行文本組件的實(shí)現(xiàn)代碼
這篇文章主要介紹了vue 折疊展示多行文本組件,自動(dòng)根據(jù)傳入的expand判斷是否需要折疊,非常完美,文章通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-10-10
vue?調(diào)用瀏覽器攝像頭實(shí)現(xiàn)及原理解析
這篇文章主要為大家介紹了vue調(diào)用瀏覽器攝像頭實(shí)現(xiàn)及原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06

