Vue+ElementUI怎麼處理超大表單例項講解
阿新 • • 發佈:2021-11-24
最近公司由於業務的調整,之前的超長表單的邏輯改動較多,所以我就打算重構了(之前是一個已離職的後臺寫的,也沒有註釋,一個元件寫了4000+行,實在有心無力)。為了各位方便閱讀,我這裡把專案裡拆分了14個元件進行了精簡。
整體思路
- 大表單根據業務模組進行拆分
- 儲存時使用el-form提供的validate方法進行www.cppcns.com校驗(迴圈對每一個拆分的元件進行校驗)
- mixin 對每個元件的公共提取(也利於後期專案的維護)
開始
這裡以拆分2個元件為例:form1,form2(方便讀者觀看,命名勿噴)
這裡兩個元件為什麼ref、model繫結的都是form後邊會進行說明(為了方便後期維護)
// form1 元件 <template> <el-form ref="form" :model="form" label-widthhttp://www.cppcns.com="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: { // 這裡是是為了父元件迴圈呼叫校驗 validForm() { let result = false this.$refs.form.validate(valid => valid && (result = true)) return result } // 我這裡還用了另一種方式寫的,但是迴圈校驗的時候是promise物件,有問題,望大佬們指點一二 validForm() { // 明明這裡輸出的結構是 Boolean 值,但在父元件迴圈呼叫之後就是promise型別,需要轉換一下才行 return this.$refs.form.validate().catch(e => console.log(e)) } } } </script> // form2 元件 <template> <el-form ref="form" :model="http://www.cppcns.comform" 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',message: '請輸入年齡',trigger: 'blur' } ] } } },methods: { // 這裡是是為了父元件迴圈呼叫校驗 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上,因此可以在遍歷時依次找到他們,修改儲存函式,程式碼如下:
methods: { save () { // 每個表單物件的 key 值,也就是每個表單的 ref 值 const formKeys = Object.keys(this.formData) // 執行每個表單的校驗方法 const valids = formKeys.map(item => this.$refs[item].validForm()) // 所有表單通過檢驗之後的邏輯 if (valids.every(item => item)) { console.log(11) } } }
解答為什麼兩個元件ref、model繫結的都是form
- 通過對比我們可以發現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,並在對應元件中刪除相應的屬性和方法即可
結尾
- 超大表單解決起來很麻煩,這裡只是對元件的拆分
- 元件之間的聯動也是一大難點,等下次整理完再發出來
到此這篇關於+ElementUI怎麼處理超大表單例項講解的文章就介紹到這了,更多相關Vue+ElementUI怎麼處理超大表單內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!