91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何解決vue+elementUI復雜表單的驗證、數據提交方案問題

發布時間:2021-08-02 14:31:46 來源:億速云 閱讀:153 作者:小新 欄目:web開發

小編給大家分享一下如何解決vue+elementUI復雜表單的驗證、數據提交方案問題,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

當我們在做后臺管理系統時,經常會遇到非常復雜的表單:

  • 表單項非常多

  • 在各種表單類型下,顯示不同的表單項

  • 在某些條件下,某些表單項會關閉驗證

  • 每個表單項還會有其他自定義邏輯,比如 輸入框可以插入模板變量、輸入字符數量顯示、圖片上傳并顯示、富文本 。。。

  • 在這種錯綜復雜的情況下,完成表單的驗證和提交

  • 可以查看具體例子:例子中省略了很多瑣碎的功能,只保留整體的復雜表單框架,用于展示解決方案

方案1: 在一個 vue 文件中

所有的表單項顯示隱藏、驗證、數據獲取、提交、自定義等邏輯放在一起

v-if/v-show
elementui

缺點

  • 還是亂

  • 一個 vue 文件,輕輕松松上 2000 行

  • 在我嘗試加入一種新的表單類型時,我發現我已經無。從。下。手。

方案2:分離組件

其實很容易想到 根據不同的表單類型,分離出多個相應類型的子表單 。但我在實踐時還是遇到了很多問題: 父子表單驗證、整體提交數據的獲取 等等,并總結出一套解決方案:

1. 子組件

所有的子組件中都需要包含兩個方法 validate 、 getData 供父組件調用。

(1) validate 方法

用于驗證本身組件的表單項,并返回一個 promise 對象

vaildate() {
 // 返回`elementUI`表單驗證的結果(為`promise`對象)
 return this.$refs["ruleForm"].validate();
},

(2) getData 方法

提供子組件中的數據

getData() {
 // 返回子組件的form
 return this.ruleForm;
},

2. 父組件

(1)策略模式

使用策略模式存儲并獲取 子表單的 ref (用于獲取子表單的方法)和 提交函數 。省略了大量的 if-else 判斷。

data:{
 // type和ref名稱的映射
 typeRefMap: {
 1: "message",
 2: "mail",
 3: "apppush"
 },
 // type和提交函數的映射。不同類型,接口可能不同
 typeSubmitMap: {
 1: data => alert(`短信模板創建成功${JSON.stringify(data)}`),
 2: data => alert(`郵件模板創建成功${JSON.stringify(data)}`),
 3: data => alert(`push模板創建成功${JSON.stringify(data)}`)
 },
}

(2) submit 方法

用于父子組件表單驗證、獲取整體數據、調用當前類型提交函數提交數據

因為 elementUI 表單驗證的 validate 方法可以返回 promise 結果 ,可以利用 promise 的特性來處理父子表單的驗證。 比如 then 函數可以返回另一個 promise 對象 、 catch 可以獲取它以上所有 then 的 reject 、 Promise.all 。

父表單驗證通過才會驗證子表單,存在先后順序

// 父表單驗證通過才會驗證子表單,存在先后順序
submitForm() {
 const templateType = this.typeRefMap[this.indexForm.type];
 this.$refs["indexForm"]
 .validate()
 .then(res => {
 // 父表單驗證成功后,驗證子表單
 return this.$refs[templateType].vaildate();
 })
 .then(res => {
 // 全部驗證通過
 // 獲取整體數據
 const reqData = {
 // 獲取子組件數據
 ...this.$refs[templateType].getData(),
 ...this.indexForm
 };
 // 獲取當前表單類型的提交函數,并提交
 this.typeSubmitMap[this.indexForm.type](reqData);
 })
 .catch(err => {
 console.log(err);
 });
},

父表單,子表單一起驗證

submitForm1() {
 const templateType = this.typeRefMap[this.indexForm.type];
 const validate1 = this.$refs["indexForm"].validate();
 const validate2 = this.$refs[templateType].vaildate();
 // 父子表單一起驗證
 Promise.all([validate1, validate2])
 .then(res => {
 // 都通過時,發送請求
 const reqData = {
 ...this.$refs[templateType].getData(),
 ...this.indexForm
 };
 this.typeSubmitMap[this.indexForm.type](reqData);
 })
 .catch(err => {
 console.log(err);
 });
},

看完了這篇文章,相信你對“如何解決vue+elementUI復雜表單的驗證、數據提交方案問題”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

堆龙德庆县| 丰都县| 婺源县| 周至县| 兴国县| 门头沟区| 伊宁县| 渑池县| 闽侯县| 特克斯县| 宜春市| 吉木萨尔县| 中牟县| 彝良县| 苗栗县| 高密市| 绥中县| 寿宁县| 太和县| 濮阳县| 安溪县| 余干县| 奉贤区| 象山县| 阿图什市| 玛曲县| 琼中| 若尔盖县| 津市市| 鄄城县| 达拉特旗| 塔城市| 三门峡市| 临泉县| 龙川县| 泗阳县| 宜兰市| 青岛市| 景洪市| 山西省| 安义县|