elementUI動態(tài)嵌套el-form表單校驗舉例詳解
一、基礎表單校驗
前端項目開發(fā)過程中表單校驗是非常常見的需求,elementUI的el-form組件也是支持配置rules屬性來配置表單項的校驗。
Form 組件允許你驗證用戶的輸入是否符合規(guī)范,來幫助你找到和糾正錯誤。
Form 組件提供了表單驗證的功能,只需為 rules 屬性傳入約定的驗證規(guī)則,并將 form-Item 的 prop 屬性設置為需要驗證的特殊鍵值即可。
例如:

不要漏掉el-from-item的prop屬性,需要和rules對象中的屬性字段對應。
定義rules對象:

提交表單時驗證規(guī)則:
校驗是通過調用表單實例(表單組件上的ref屬性綁定的變量)上的validate方法來實現的(異步)

這樣,在我們進行驗證時,如果表單項不符合rules中的規(guī)則,那么就會在對應的表單項下面提示我們設定的提示信息。

校驗規(guī)則
elementUI中el-from校驗的規(guī)則是引用的https://github.com/yiminghe/async-validator
比較常用的規(guī)則屬性有:
必填:required
可以賦值一個boolean值,true表示必填。
類型:type
賦值有一個字符,表示要驗證的內容的類型:string、number等,詳情見下圖:

正則驗證:pattern
如果對于type無法驗證的值,我們可以使用pattern賦值一個正則表達式來更加靈活的驗證規(guī)則。
驗證前轉換:transform
有時有必要在驗證之前轉換一個值,可以使用tansform屬性,是一個函數,參數是要驗證的值,該函數的返回值是處理后再驗證的值。
例如上面代碼name的校驗中就用到了這幾個屬性,其中transform會將用戶輸入的內容去掉字符串首位空格(trim方法)后再進行其他規(guī)則驗證。
name: {
type: 'string',
required: true,
pattern: /^[a-z]+$/,
transform(value) {
return value.trim();
},
}二、動態(tài)嵌套表單校驗
了解了基礎的表單校驗,那么有的時候會遇到比較復雜的表單對象,并且可能需要動態(tài)增加表單項。
elementUI官網給出了一個比較簡單的例子:添加/刪除表單項
在此基礎上,我增加了一下表單對象的復雜度。

可以看到,domains數組每個對象下包含了info對象屬性,info對象下有name和intro屬性,是一個嵌套的對象,并且我們可以動態(tài)的新增和刪除domains中的對象,那么在表單中該如何驗證呢?
本質上,檢驗是通過設置的rules對象中的屬性,去匹配表單項上設置的prop,然后對雙向綁定的內容進行驗證。
首先,我們設置rules對象:

直接按照表單對象的層級設置屬性即可,因為domains數組中的對象肯定是公用一套規(guī)則的。

可以看到,我們直接循環(huán)domains數組,然后通過設置prop="'domains.' + index + '.value'"來實現數組中的每個對象獨立校驗。
接著我們還要在每個表單項el-form-item上定義對應的rules,就能達到新增的表單項也能夠校驗的目的了。
效果:

三、示例源碼
代碼基于vue3 + ts,項目中如果安裝并注冊了elemetPlus,可以直接cv查看效果。
<template>
<div class="form-box">
<el-form ref="formRef" :model="dynamicValidateForm" label-width="120px" :rules="rules">
<div class="inner-form-box">
<el-form-item prop="email" label="Email??">
<el-input v-model="dynamicValidateForm.email" />
</el-form-item>
</div>
<div v-for="(domain, index) in dynamicValidateForm.domains" :key="domain.key" class="inner-form-box">
<span>{{ `網站${index + 1}??:` }}</span>
<el-form-item label="網站域名:" :prop="'domains.' + index + '.value'" :rules="rules.domains.value">
<el-input v-model="domain.value" />
</el-form-item>
<div>
<span>{{ `網站${index + 1}詳情??:` }}</span>
<el-form-item label="網站名稱:" :prop="'domains.' + index + '.info.name'" :rules="rules.domains.info.name">
<el-input v-model="domain.info.name" />
</el-form-item>
<el-form-item label="網站簡介:" :prop="'domains.' + index + '.info.intro'"
:rules="rules.domains.info.intro">
<el-input v-model="domain.info.intro" />
</el-form-item>
</div>
<div class="del-btn-box">
<el-button type="danger" link @click="removeDomain(domain)">刪除</el-button>
</div>
</div>
<el-form-item>
<el-button type="primary" @click="submitForm(formRef)">Submit</el-button>
<el-button @click="addDomain">New domain</el-button>
<el-button @click="resetForm(formRef)">Reset</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script lang="ts" setup>
import { reactive, ref } from 'vue'
import type { FormInstance } from 'element-plus'
const formRef = ref<FormInstance>()
const dynamicValidateForm = reactive<{
domains: DomainItem[]
email: string
}>({
domains: [
{
key: 1,
value: '',
info: {
name: '',
intro: ''
}
},
],
email: '',
})
const rules = {
email: [
{required: true,message: '郵箱地址不能為空哦',trigger: 'blur',},
{type: 'email',message: '請輸入正確的郵箱格式',trigger: ['blur', 'change'],},
],
domains: {
value: {required: true,message: '網站域名不能為空哦',trigger: 'blur',},
info: {
name: {required: true,message: '網站名稱不能為空哦',trigger: 'blur',},
intro: {required: true,message: '網站簡介不能為空哦',trigger: 'blur',}
}
}
}
interface DomainItem {
key: number
value: string
info: {
name: string
intro: string
}
}
const removeDomain = (item: DomainItem) => {
const index = dynamicValidateForm.domains.indexOf(item)
if (index !== -1) {
dynamicValidateForm.domains.splice(index, 1)
}
}
const addDomain = () => {
dynamicValidateForm.domains.push({
key: Date.now(),
value: '',
info: {
name: '',
intro: ''
}
})
}
const submitForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.validate((valid) => {
if (valid) {
console.log(dynamicValidateForm)
} else {
console.log('error submit!')
return false
}
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()
}
</script>
<style scoped>
.form-box {
padding: 50px;
}
.inner-form-box {
position: relative;
padding: 10px;
margin-bottom: 10px;
box-shadow: 0px 0px 5px 0px #f2f2f2;
}
.del-btn-box {
position: absolute;
right: 0;
top: 0;
transform: translateX(120%);
}
</style>總結
到此這篇關于elementUI動態(tài)嵌套el-form表單校驗的文章就介紹到這了,更多相關elementUI動態(tài)嵌套表單校驗內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用Vue3和Plotly.js繪制動態(tài)3D圖表的示例代碼
在數據可視化應用中,需要將數據動態(tài)加載到圖表中并進行實時更新,本文將展示如何使用Plotly.js和Vue.js實現這一功能,從加載外部數據到創(chuàng)建交互式圖表,文中有相關的代碼示例供大家參考,需要的朋友可以參考下2024-06-06

