1. 定义全局注册的方法
  2. 在main.ts/js中全局引入定义好的方法 并 调用它
  3. 在组件中通过<component is='组件名称(无须导入,写对应的字符串类型的组件名称即可)'></component>
  4. 代码详情
  5. // 定义全局注册组件方法
    // 1. 引入vue中的方法
    import { defineAsyncComponent } from "vue"
    
    // 2.定义对象 实现方法
    const registerComponent = {
     // 定义方法
     install(app) {
         // 批量读取并能导入组件
         let readSrcComponent = import.meta.glob("@/components/*/index.vue");
         // console.log(readSrcComponent);
         /* 
             "/src/components/MyButton/index.vue"
             "/src/components/Text/index.vue"
             ...
         */
         // 获取 readSrcComponent对象中 所有的key值 
         const keys = Object.keys(readSrcComponent)
         // console.log(keys);
         // ['/src/components/MyButton/index.vue', '/src/components/Text/index.vue',...] 
         // 获取readSrcComponent对象中所有的value值
         const values = Object.values(readSrcComponent)
         // console.log(values);
         /* 
         [
             () => import("/src/components/MyButton/index.vue")
             () => import("/src/components/Text/index.vue")
         ]
         */
         // 遍历对象 实现批量注册组件
         keys.forEach((item, index) => {
             // console.log(item);
             /* 
                 /src/components/MyButton/index.vue
                 /src/components/Text/index.vue
             */
             // 使用正则替换 原始内容 获取文件名称 一个小括号代表一个$ $1(/src/components) $2(MyButton ... 符合规范的) $3(index.vue)
             const componentName = item.replace(/(\/src\/components\/)([a-zA-Z]+)(\/index\.vue)/, '$2')
             // console.log(componentName); //  MyButton Text ... 
             // 根据index下标 获取value中对应的路径
             const component = values[index]
             // console.log(component);  () => import("/src/components/MyButton/index.vue") ...
             // 调用 app参数 实现全局注册组件
             app.component(componentName, defineAsyncComponent(component))
         })
    
         // 跟上面方法一样 实现组件样式的全局注册
         // 批量读取并导入所有 组件样式组件
         let readSrcPropComponent = import.meta.glob("@/components/*/prop.vue")
         // console.log(readSrcPropComponent);
         // 所有的key值
         const propKeys = Object.keys(readSrcPropComponent)
         // console.log(propKeys);
         // 获取所有的value值
         const propValues = Object.values(readSrcPropComponent)
         // console.log(propValues);
         // 循环遍历对象实现全局注册样式组件
         propKeys.forEach((item, index) => {
             // 使用正则获取 用户名 并替换成想要的效果 拼接上Prop结尾的名称
             const propComponentName = item.replace(/(\/src\/components\/)([a-zA-Z]+)(\/prop\.vue)/, '$2Prop')
             // console.log(propComponentName); MyButtonProp...
             // 获取对应的路径根据下标
             const component = propValues[index]
    
             // 使用app 全局注册样式组件
             app.component(propComponentName, defineAsyncComponent(component))
         })
    
     }
    
    }
    
    
    // 最后导出
    export default registerComponent

    在main.ts中的操作
    image.png
    测试+效果:
    image.png
    image.png


hanbo_bo
16 声望1 粉丝