需求:将src/components/lib文件夹下所有.vue文件注册为全局组件

一、下面先展示vue2操作流程:

1.src/components/lib下创建index.js文件,代码:

export default {
  install(Vue, options) {
    // 1.读取lib文件夹下的文件
    // const req = requeire.context('路径', 是否读取子文件夹, /正则匹配/)
    const req = require.context('./', false, /\.vue$/)
    // req是一个function函数(传入读取文件路径后可导入文件)
    req.keys().forEach((item) => {
      console.log(req(item).default)
      // req(item).default==导入了该文件路径
      const com = req(item).default
      // 全局注册
      Vue.component(com.name, com)
    })
    console.log(options)
  }
}

2.main.js中导入文件并通过use注册

// 注册全局的组件
import libJs from '@/components/lib/index.js'
Vue.use(libJs)

Vue3操作流程(仅提供第一步代码,第二步是一样的哈)

大致步骤:

  1. 使用 require 提供的函数 context 加载某一个目录下的所有 .vue 后缀的文件。
  2. 然后 context 函数会返回一个导入函数 importFn
  3. 使用context 函数的属性 keys() 获取所有的文件路径
  4. 通过文件路径数组,通过遍历数组,再使用 importFn 根据路径导入组件对象值
  5. 遍历的同时进行全局注册即可
// 导入library文件夹下的所有组件
// 批量导入需要使用一个函数 require.context(dir,deep,matching)
// 参数:1. 目录  2. 是否加载子目录  3. 加载的正则匹配
const importFn = require.context('./', false, /\.vue$/)
// console.dir(importFn.keys()) 文件名称数组

export default {
  install (app) {

    // 批量注册全局组件
    importFn.keys().forEach(key => {
      // 导入组件
      const component = importFn(key).default
      // 注册组件
      app.component(component.name, component)
    })

    // 定义指令
    defineDirective(app)
  }
}

//如果你写了自定义指令可以统一全局注册
const defineDirective = (app) => {
  // 图片懒加载指令 v-lazyload
  app.directive('lazyload', {
    // vue2.0 inserted函数,元素渲染后
    // vue3.0 mounted函数,元素渲染后
    mounted (el, binding) {
      // 元素插入后才能获取到dom元素,才能使用 intersectionobserve进行监听进入可视区
      // el 是图片元素  binding.value 图片地址
      const observe = new IntersectionObserver(([{ isIntersecting }]) => {
        if (isIntersecting) {
          el.src = binding.value
          // 取消观察
          observe.unobserve(el)
        }
      }, {
        threshold: 0.01
      })
      // 进行观察
      observe.observe(el)
    }
  })
}

这里需要注意的是:v3+ts全局注册的组件props没有类型提示,但是需要制定类型

可以在src下建立一个global.d.ts文件,参考element-plus做类型提示

// 参考element-plus做类型提示
import XtxSkeleton from "@/components/skeleton/index.vue";
import XtxCarousel from "@/components/carousel/index.vue";
import XtxMore from "@/components/more/index.vue";
import XtxBread  from '@/components/bread/index.vue'
import XtxBreadItem  from '@/components/breadItem/index.vue'
declare module "vue" {
  export interface GlobalComponents {
    XtxSkeleton: typeof XtxSkeleton;
    XtxCarousel: typeof XtxCarousel;
    XtxMore: typeof XtxMore;
    XtxBread: typeof XtxBread;
    XtxBreadItem: typeof XtxBreadItem;
  }
}
export {};

Logo

前往低代码交流专区

更多推荐