Vue+ElementUI怎么處理超大表單實例講解
最近公司由于業(yè)務(wù)的調(diào)整,之前的超長表單的邏輯改動較多,所以我就打算重構(gòu)了(之前是一個已離職的后臺寫的,也沒有注釋,一個組件寫了4000+行,實在有心無力)。為了各位方便閱讀,我這里把項目里拆分了14個組件進行了精簡。
整體思路
- 大表單根據(jù)業(yè)務(wù)模塊進行拆分
- 保存時使用el-form提供的validate方法進行校驗(循環(huán)對每一個拆分的組件進行校驗)
- mixin 對每個組件的公共提取(也利于后期項目的維護)
開始
這里以拆分2個組件為例:form1, form2(方便讀者觀看,命名勿噴)
這里兩個組件為什么ref、model綁定的都是form后邊會進行說明(為了方便后期維護)
// form1 組件 <template> <el-form ref="form" :model="form" label-width="10px" > <el-form-item label="姓名" prop="name"> <el-input v-model="form.name" /> </el-form-item> </el-form> </template> <script> export default { name: 'Form1', props: { form: {} }, data() { return { rules: { name: [ { required: true, message: '請輸入姓名', trigger: 'blur' } ] } } }, methods: { // 這里是是為了父組件循環(huán)調(diào)用校驗 validForm() { let result = false this.$refs.form.validate(valid => valid && (result = true)) return result } // 我這里還用了另一種方式寫的,但是循環(huán)校驗的時候是promise對象,有問題,望大佬們指點一二 validForm() { // 明明這里輸出的結(jié)構(gòu)是 Boolean 值,但在父組件循環(huán)調(diào)用之后就是promise類型,需要轉(zhuǎn)換一下才行 return this.$refs.form.validate().catch(e => console.log(e)) } } } </script> // form2 組件 <template> <el-form ref="form" :model="form" label-width="10px" > <el-form-item label="年齡" prop="age"> <el-input v-model="form.age" /> </el-form-item> </el-form> </template> <script> export default { name: 'Form2', props: { form: {} }, data() { return { rules: { name: [ { required: true, message: '請輸入年齡', trigger: 'blur' } ] } } }, methods: { // 這里是是為了父組件循環(huán)調(diào)用校驗 validForm() { let result = false this.$refs.form.validate(valid => valid && (result = true)) return result } } } </script>
看一下父組件怎么引用的
// 父組件 <template> <div class="parent"> <form1 ref="form1" :form="formData.form1" /> <form2 ref="form2" :form="formData.form2" /> <el-button type="primary" @click="save">報錯</el-button> </div> </template> <script> ... 省略引用 export default { name: 'parent', ... 省略注冊 data () { return { formData: { form1: {}, form2: {} } } }, } </script>
由于formData里的屬性名form1和form2分別用在子表單組件的ref上,因此可以在遍歷時依次找到他們,修改保存函數(shù),代碼如下:
methods: { save () { // 每個表單對象的 key 值,也就是每個表單的 ref 值 const formKeys = Object.keys(this.formData) // 執(zhí)行每個表單的校驗方法 const valids = formKeys.map(item => this.$refs[item].validForm()) // 所有表單通過檢驗之后的邏輯 if (valids.every(item => item)) { console.log(11) } } }
解答為什么兩個組件ref、model綁定的都是form
- 通過對比我們可以發(fā)現(xiàn)form1 form2有共同的 props methods
- 我們通過 mixin 提取一下
export default { props: { form: { required: true, type: Object, default: () => {} }, }, methods: { validForm () { let result = false this.$refs.form.validate(valid => valid && (result = true)) return result } } }
在 form1 form2 中引用該minix,并在對應(yīng)組件中刪除相應(yīng)的屬性和方法即可
結(jié)尾
- 超大表單解決起來很麻煩,這里只是對組件的拆分
- 組件之間的聯(lián)動也是一大難點,等下次整理完再發(fā)出來
到此這篇關(guān)于Vue+ElementUI怎么處理超大表單實例講解的文章就介紹到這了,更多相關(guān)Vue+ElementUI怎么處理超大表單內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ant-design-vue中設(shè)置Table每頁顯示的條目數(shù)量方式
這篇文章主要介紹了ant-design-vue中設(shè)置Table每頁顯示的條目數(shù)量方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10vue中$event使用之獲取當(dāng)前元素及相關(guān)元素
這篇文章主要介紹了vue中$event使用之獲取當(dāng)前元素及相關(guān)元素,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10vuex 動態(tài)注冊方法 registerModule的實現(xiàn)
這篇文章主要介紹了vuex 動態(tài)注冊方法 registerModule的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07vue 數(shù)據(jù)遍歷篩選 過濾 排序的應(yīng)用操作
這篇文章主要介紹了vue 數(shù)據(jù)遍歷篩選 過濾 排序的應(yīng)用操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11