1 原理
import.meta.glob() 其实不仅能接收一个字符串,还可以接收一个字符串数组,就是匹配多个位置
let RouterModules = import.meta.glob(["/src/view/*/*.vue", "/src/view/*.vue"]);
这样我们就拿到了相对路劲的组件对象,通过@/views/ 绝对路径匹配不行,只能相对路径;
2 调用样例
1)这样我 通过 字符串拿到组件方法,然后 await 组件方法() 加载组件
2)也可以等待 nextTick() 后,再执行组件内的方法
<template>
<button @click="openAudit('agency/project/projectAudit.vue')">审批</v-btn>
<!-- 审批表单组件 -->
<component ref="auditRef" :is="auditComponent" v-if="auditComponent"></component>
</template>
<script setup>
// 动态审批组件
const auditRef = ref()
// 动态审批组件引用
const auditComponent = ref(null)
//通过glob 将制定 制定路径加载至 map对象,key为路径,value 组件的加载方法,需执行后才能加载
const viteComponents = import.meta.glob('../../**/*.vue')
//打开相应的审批表单
const openAudit = async (vuePath) => {
const componentPath = `../../${vuePath}`
try {
const module = await viteComponents[componentPath]()
auditComponent.value = module.default || module
await nextTick()
// 调用组件的 open 方法
auditRef.value.open()
} catch (error) {
console.error(`Failed to load component ${componentPath}:`, error)
auditComponent.value = null // Or handle the error appropriately
}
}
</script>