您好,登錄后才能下訂單哦!
Vue+ElementUI怎么處理超大表單,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
最近公司由于業(yè)務(wù)的調(diào)整,之前的超長(zhǎng)表單的邏輯改動(dòng)較多,所以我就打算重構(gòu)了(之前是一個(gè)已離職的后臺(tái)寫的,也沒有注釋,一個(gè)組件寫了4000+行,實(shí)在有心無力)。為了各位方便閱讀,我這里把項(xiàng)目里拆分了14個(gè)組件
進(jìn)行了精簡(jiǎn)。
大表單根據(jù)業(yè)務(wù)模塊進(jìn)行拆分
保存時(shí)使用el-form
提供的validate
方法進(jìn)行校驗(yàn)(循環(huán)對(duì)每一個(gè)拆分的組件進(jìn)行校驗(yàn))
mixin 對(duì)每個(gè)組件的公共提取(也利于后期項(xiàng)目的維護(hù))
這里以拆分2個(gè)組件
為例:form1
, form2
(方便讀者觀看,命名勿噴)
這里兩個(gè)組件為什么ref、model
綁定的都是form
后邊會(huì)進(jìn)行說明(為了方便后期維護(hù))
// 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: '請(qǐng)輸入姓名', trigger: 'blur' } ] } } }, methods: { // 這里是是為了父組件循環(huán)調(diào)用校驗(yàn) validForm() { let result = false this.$refs.form.validate(valid => valid && (result = true)) return result } // 我這里還用了另一種方式寫的,但是循環(huán)校驗(yàn)的時(shí)候是promise對(duì)象,有問題,望大佬們指點(diǎn)一二 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: '請(qǐng)輸入年齡', trigger: 'blur' } ] } } }, methods: { // 這里是是為了父組件循環(huán)調(diào)用校驗(yàn) 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">報(bào)錯(cuò)</el-button> </div> </template> <script> ... 省略引用 export default { name: 'parent', ... 省略注冊(cè) data () { return { formData: { form1: {}, form2: {} } } }, } </script>
由于formData
里的屬性名form1
和form2
分別用在子表單組件的ref
上,因此可以在遍歷時(shí)依次找到他們,修改保存函數(shù),代碼如下:
methods: { save () { // 每個(gè)表單對(duì)象的 key 值,也就是每個(gè)表單的 ref 值 const formKeys = Object.keys(this.formData) // 執(zhí)行每個(gè)表單的校驗(yàn)方法 const valids = formKeys.map(item => this.$refs[item].validForm()) // 所有表單通過檢驗(yàn)之后的邏輯 if (valids.every(item => item)) { console.log(11) } } }
ref、model
綁定的都是form
通過對(duì)比我們可以發(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
,并在對(duì)應(yīng)組件中刪除相應(yīng)的屬性和方法即可
超大表單解決起來很麻煩,這里只是對(duì)組件的拆分
組件之間的聯(lián)動(dòng)也是一大難點(diǎn),等下次整理完再發(fā)出來
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。