vue+elementUI 復(fù)雜表單的驗(yàn)證、數(shù)據(jù)提交方案問題
當(dāng)我們在做后臺(tái)管理系統(tǒng)時(shí),經(jīng)常會(huì)遇到非常復(fù)雜的表單:
- 表單項(xiàng)非常多
- 在各種表單類型下,顯示不同的表單項(xiàng)
- 在某些條件下,某些表單項(xiàng)會(huì)關(guān)閉驗(yàn)證
- 每個(gè)表單項(xiàng)還會(huì)有其他自定義邏輯,比如 輸入框可以插入模板變量、輸入字符數(shù)量顯示、圖片上傳并顯示、富文本 。。。
- 在這種錯(cuò)綜復(fù)雜的情況下,完成表單的驗(yàn)證和提交
- 可以查看具體例子:例子中省略了很多瑣碎的功能,只保留整體的復(fù)雜表單框架,用于展示解決方案
方案1: 在一個(gè) vue 文件中
所有的表單項(xiàng)顯示隱藏、驗(yàn)證、數(shù)據(jù)獲取、提交、自定義等邏輯放在一起
v-if/v-show elementui
缺點(diǎn)
- 亂
- 亂
- 還是亂
- 一個(gè) vue 文件,輕輕松松上 2000 行
- 在我嘗試加入一種新的表單類型時(shí),我發(fā)現(xiàn)我已經(jīng)無。從。下。手。
方案2:分離組件
其實(shí)很容易想到 根據(jù)不同的表單類型,分離出多個(gè)相應(yīng)類型的子表單 。但我在實(shí)踐時(shí)還是遇到了很多問題: 父子表單驗(yàn)證、整體提交數(shù)據(jù)的獲取 等等,并總結(jié)出一套解決方案:
1. 子組件
所有的子組件中都需要包含兩個(gè)方法 validate 、 getData 供父組件調(diào)用。
(1) validate 方法
用于驗(yàn)證本身組件的表單項(xiàng),并返回一個(gè) promise 對象
vaildate() {
// 返回`elementUI`表單驗(yàn)證的結(jié)果(為`promise`對象)
return this.$refs["ruleForm"].validate();
},
(2) getData 方法
提供子組件中的數(shù)據(jù)
getData() {
// 返回子組件的form
return this.ruleForm;
},
2. 父組件
(1)策略模式
使用策略模式存儲(chǔ)并獲取 子表單的 ref (用于獲取子表單的方法)和 提交函數(shù) 。省略了大量的 if-else 判斷。
data:{
// type和ref名稱的映射
typeRefMap: {
1: "message",
2: "mail",
3: "apppush"
},
// type和提交函數(shù)的映射。不同類型,接口可能不同
typeSubmitMap: {
1: data => alert(`短信模板創(chuàng)建成功${JSON.stringify(data)}`),
2: data => alert(`郵件模板創(chuàng)建成功${JSON.stringify(data)}`),
3: data => alert(`push模板創(chuàng)建成功${JSON.stringify(data)}`)
},
}
(2) submit 方法
用于父子組件表單驗(yàn)證、獲取整體數(shù)據(jù)、調(diào)用當(dāng)前類型提交函數(shù)提交數(shù)據(jù)
因?yàn)?nbsp;elementUI 表單驗(yàn)證的 validate 方法可以返回 promise 結(jié)果 ,可以利用 promise 的特性來處理父子表單的驗(yàn)證。 比如 then 函數(shù)可以返回另一個(gè) promise 對象 、 catch 可以獲取它以上所有 then 的 reject 、 Promise.all 。
父表單驗(yàn)證通過才會(huì)驗(yàn)證子表單,存在先后順序
// 父表單驗(yàn)證通過才會(huì)驗(yàn)證子表單,存在先后順序
submitForm() {
const templateType = this.typeRefMap[this.indexForm.type];
this.$refs["indexForm"]
.validate()
.then(res => {
// 父表單驗(yàn)證成功后,驗(yàn)證子表單
return this.$refs[templateType].vaildate();
})
.then(res => {
// 全部驗(yàn)證通過
// 獲取整體數(shù)據(jù)
const reqData = {
// 獲取子組件數(shù)據(jù)
...this.$refs[templateType].getData(),
...this.indexForm
};
// 獲取當(dāng)前表單類型的提交函數(shù),并提交
this.typeSubmitMap[this.indexForm.type](reqData);
})
.catch(err => {
console.log(err);
});
},
父表單,子表單一起驗(yàn)證
submitForm1() {
const templateType = this.typeRefMap[this.indexForm.type];
const validate1 = this.$refs["indexForm"].validate();
const validate2 = this.$refs[templateType].vaildate();
// 父子表單一起驗(yàn)證
Promise.all([validate1, validate2])
.then(res => {
// 都通過時(shí),發(fā)送請求
const reqData = {
...this.$refs[templateType].getData(),
...this.indexForm
};
this.typeSubmitMap[this.indexForm.type](reqData);
})
.catch(err => {
console.log(err);
});
},
查看在線項(xiàng)目,項(xiàng)目github和組件代碼
總結(jié)
以上所述是小編給大家介紹的vue+elementUI 復(fù)雜表單的驗(yàn)證、數(shù)據(jù)提交方案問題,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
- Vue+ElementUi實(shí)現(xiàn)點(diǎn)擊表格鏈接頁面跳轉(zhuǎn)和路由效果
- Vue+ElementUi實(shí)現(xiàn)點(diǎn)擊表格中鏈接進(jìn)行頁面跳轉(zhuǎn)與路由詳解
- vue+elementUI實(shí)現(xiàn)動(dòng)態(tài)合并數(shù)據(jù)相同的單元格(可指定合并列)
- VUE使用ElementUI下拉框 @change事件數(shù)據(jù)不回顯問題
- Vue組件庫ElementUI實(shí)現(xiàn)表格加載樹形數(shù)據(jù)教程
- Vue結(jié)合ElementUI實(shí)現(xiàn)數(shù)據(jù)請求和頁面跳轉(zhuǎn)功能(最新推薦)
相關(guān)文章
淺談在vue項(xiàng)目中如何定義全局變量和全局函數(shù)
本篇文章主要介紹了淺談在vue項(xiàng)目中如何定義全局變量和全局函數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
Vue中使用Element UI的Table組件實(shí)現(xiàn)嵌套表格功能
這篇文章主要介紹了Vue中使用Element UI的Table組件實(shí)現(xiàn)嵌套表格功能,演示如何在Vue中使用Element UI的Table組件實(shí)現(xiàn)嵌套表格,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01
element plus tree拖動(dòng)節(jié)點(diǎn)交換位置和改變層級(jí)問題(解決方案)
圖層list里有各種組件,用element plus的tree來渲染,可以把圖片等組件到面板里,面板是容器,非容器組件,比如圖片、文本等,就不能讓其他組件拖進(jìn)來,這篇文章主要介紹了element plus tree拖動(dòng)節(jié)點(diǎn)交換位置和改變層級(jí)問題(解決方案),需要的朋友可以參考下2024-04-04
vue el-table 動(dòng)態(tài)添加行與刪除行的實(shí)現(xiàn)
這篇文章主要介紹了vue el-table 動(dòng)態(tài)添加行與刪除行的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
Vue實(shí)現(xiàn)封裝一個(gè)切片上傳組件
平時(shí)業(yè)務(wù)開發(fā)中用el-upload能滿足大部分場景,但是對于一些大文件的上傳時(shí)會(huì)比較慢,所以自己基于el-upload封裝了一個(gè)切片上傳組件,希望對大家有所幫助2023-03-03
vue3中各種類型文件進(jìn)行預(yù)覽功能實(shí)例
在vue移動(dòng)端項(xiàng)目中經(jīng)常遇到這樣的需求,對一些上傳的附件可以點(diǎn)擊之后在線預(yù)覽,所以下面這篇文章主要給大家介紹了關(guān)于vue3中各種類型文件進(jìn)行預(yù)覽功能的相關(guān)資料,需要的朋友可以參考下2021-09-09
使用ElementUI中el-upload上傳文件轉(zhuǎn)base64格式
這篇文章主要介紹了使用ElementUI中el-upload上傳文件轉(zhuǎn)base64格式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
element ui el-date-picker組件默認(rèn)值方式
這篇文章主要介紹了element ui el-date-picker組件默認(rèn)值方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
Unocss(原子化css)?使用及vue3?+?vite?+?ts講解
這篇文章主要介紹了Unocss(原子化css)使用vue3?+?vite?+?ts的方法,簡單介紹了Unocss使用及圖標(biāo)庫使用,通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11

