Vue之循環<component>組件時調用子組件的校驗方法實現多態
本代碼通過Vue循環<component>組件時,調用子組件的校驗方法,實現多態,避免修改父組件,增強擴展性。
父組件原代碼:
<div v-for="comp in compList"> <template v-if="comp.isShow"> <component :is="compMap[comp.type]" :item="comp" :formData="formData" :compList="compList" :userInfo="userInfo" class="comp" v-if="isLoadedData && isComponentsShow" /> </template> </div>
由于有v-for所以新增動態ref
<div v-for="comp in compList"> <template v-if="comp.isShow"> <component :is="compMap[comp.type]" :item="comp" :formData="formData" :compList="compList" :userInfo="userInfo" class="comp" v-if="isLoadedData && isComponentsShow" :ref="setDynamicRef(comp.prop)" /> </template> </div>
動態生成ref
// 用于存儲動態 ref 的對象 const dynamicComponentRefs = ref({}); // 設置動態 ref 的方法 const setDynamicRef = (prop) => { return (el) => { dynamicComponentRefs.value[prop] = el; }; };
父組件調用
if ( dynamicComponentRefs.value[comp.prop] && comp.regExp && comp.regExp !== "" ) { const res = dynamicComponentRefs.value[comp.prop].validateCompValue(comp); if (!res) { return; } }
子組件定義校驗方法并暴露方法
const validateCompValue = (comp) => { const val = formData.value[comp.prop]; if (!new RegExp(comp.regExp).test(val)) { message.error(comp.regExpTip); return false; } else { return true; } }; // 向外暴露方法 defineExpose({ validateCompValue, });
即可。

浙公網安備 33010602011771號