您好,登錄后才能下訂單哦!
這篇文章主要講解了“vue開發中后臺系統復雜表單優化技巧是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“vue開發中后臺系統復雜表單優化技巧是什么”吧!
<template> <el-form ref="ruleForm" :rules="rules" :model="form" inline > <el-form-item label="企業性質" prop="natureEnterprise"> <el-select v-model="form.natureEnterprise"> <el-option label="國企" :value="1" /> <el-option label="事業單位" :value="2" /> <el-option label="個體戶" :value="3" /> </el-select> </el-form-item> <el-form-item label="業務類型" prop="type"> <el-select v-model="form.type"> <el-option label="護膚" :value="1" /> <el-option label="食品" :value="2" /> </el-select> </el-form-item> <el-form-item label="企業名稱" prop="name"> <el-input v-model="form.name" placeholder="請輸入"></el-input> </el-form-item> <el-form-item label="社會統一信用代碼" prop="creditCode"> <el-input v-model="form.creditCode" placeholder="請輸入"></el-input> </el-form-item> <el-form-item label="注冊地址" prop="address"> <el-input v-model="form.address" placeholder="請輸入"></el-input> </el-form-item> </el-form> </template> <script> export default { data() { return { form: { natureEnterprise: null, type: null, address: '', name: '', creditCode: '' }, rules: { natureEnterprise: [ { required: true, message: '企業性質不能為空', trigger: 'change' } ], type: [ { required: true, message: '業務類型不能為空', trigger: 'change' } ], address: [ { required: true, message: '注冊地址不能為空', trigger: 'change' } ], name: [ { required: true, message: '企業名稱不能為空', trigger: 'change' } ], creditCode: [ { required: true, message: '社會統一信用代碼不能為空', trigger: 'change' } ] } } } } </script>
以上表單為例,要求默認全部必填,如果企業性質為個體戶,則注冊地址和社會統一信用代碼為非必填,讓我們增加以下代碼來實現這個需求:
watch: { 'form.natureEnterprise': { hanlder(val) { this.rules.creditCode[0].required = val !== 3 this.rules.address[0].required = val !== 3 } } }
如果此時新增一個校驗,假設要求業務類型為護膚時,企業名稱非必填,那我們需要像上面監聽業務類型的值然后做相應的判斷,隨著表單內容的增多,我們的watch會越來越多,同時rules也會散落在不同的地方,這必然會為后續的代碼維護帶來困難,接手的人也必須小心翼翼的在上面做修改。
將rules作為計算屬性里的值統一處理,而不是放在data里,避免需要頻繁去操作data里的rules,也避免rules的項散落在頁面各處。
computed: { rules({ form }) { // 是否個體戶 const isSelfEmploy = form.natureEnterprise === 3 return { natureEnterprise: [ { required: true, message: '企業性質不能為空', trigger: 'change' } ], type: [ { required: true, message: '業務類型不能為空', trigger: 'change' } ], name: [ { required: true, message: '企業名稱不能為空', trigger: 'change' } ], address: [ { required: !isSelfEmploy, message: '注冊地址不能為空', trigger: 'change' } ], creditCode: [ { required: !isSelfEmploy, message: '社會統一信用代碼不能為空', trigger: 'change' } ] } } }
改用computed后,會有一個問題:頁面初始加載或computed里使用的相關值改變時會立即觸發檢驗。看起來體驗不是很好,el-form
有一個validate-on-rule-change
屬性,表示會在rules
屬性改變后立即觸發一次驗證,默認為true,將其設置為false即可
<el-form :validate-on-rule-change="false" ></el-form>
當表單內容變得龐大時,將其塞在一個文件里進行開發時無疑會變得很臃腫。這時候我們可以將其拆分成一個一個的組件,每個組件里獨立負責自己的表單內容以及校驗,最后提交時由父組件統一收集每個子組件的數據進行提交,這樣避免了所有內容都放在一個文件里變得大而雜,同時也有利于團隊多人進行開發,減少沖突。
// 父組件:main-form.vue <template> <!-- 子組件-基礎信息表單 --> <base-form ref="baseFormRef" /> <!-- 子組件-合作信息表單 --> <coop-form ref="coopFormRef" /> <el-button type="primary" @click="handleSave">保存</el-button> </template> <script> import BaseForm from './base-form' import CoopForm from './coop-form' export default { components: { BaseForm, CoopForm }, methods: { async handleSave() { // 調用子組件提供的方法,獲取表單數據 const baseFormData = await this.$refs['baseFormRef'].validate() const coopFormData = await this.$refs['coopFormRef'].validate() if (baseFormData && coopFormData) { // 如果校驗通過,拼接子組件數據進行提交 const mainFormData = { ...baseFormData, ...coopFormData } // 提交數據 await saveApi(mainForm) this.$message.success('保存成功!') } } } } </script>
子組件負責處理自己的內容,同時提供方法給父組件調用,在方法里進行校驗,校驗通過后再返回自身的表單數據給父組件。
// 子組件示例:base-form.vue <template> <el-form ref="ruleForm" :model="form" :rules="rules"> </el-form> </template> <script> export default { data() { return { form: { // ... }, rules: { // ... } } }, methods: { // 提供給父組件的方法并返回表單數據 validate() { return new Promise(resolve => { this.$refs['ruleForm'].validate(valid => { // 校驗通過返回表單數據,反之,返回null if (valid) { resolve(this.form) } else { resolve(null) } }) }) } } } </script>
將大表單拆分后,有些時候兄弟組件間需要通信,例如coop-form里的某個字段需要根據base-form的某個字段來決定是否必填。我通常選擇使用vuex解決,在base-form的值變化時將其保存到vuex里,coop-form則可以從vuex里獲取,然后進行自己的邏輯處理。
// vuex里新建文件用來存放表單通信數據 // src/store/modules/formDta.js export default { namespaced: true, state: { natureEnterprise: '' }, mutations: { SET_NATURE_ENTERPRISE(state, payload) { state.natureEnterprise = payload } } } // src/store/index.js import Vue from 'vue' import Vuex from 'vuex' import formData from './modules/formData.js' Vue.use(Vuex) export default new Vuex.Store({ modules: { formData } })
// base-form.vue watch: { 'form.natureEnterprise': { handler(val) { // 將企業性質的值存儲到vuex里 this.$store.commit('formData/SET_NATURE_ENTERPRISE', val) } } }
// coop-form.vue computed: { ...mapState('formData', [ 'natureEnterprise' ]), rules() { return { address: [ { required: this.natureEnterprise === 1, message: '注冊地址不能為空', trigger: 'change' } ] } } }
感謝各位的閱讀,以上就是“vue開發中后臺系統復雜表單優化技巧是什么”的內容了,經過本文的學習后,相信大家對vue開發中后臺系統復雜表單優化技巧是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。