Vue2/Vue3:一步操作实现多个Vue组件全局注册
需求:将src/components/lib文件夹下所有.vue文件注册为全局组件。大致步骤:使用require提供的函数context加载某一个目录下的所有.vue后缀的文件。然后context函数会返回一个导入函数importFn使用context函数的属性keys()获取所有的文件路径通过文件路径数组,通过遍历数组,再使用importFn根据路径导入组件对象值遍历的同时进行全局注册即可需要注
·
需求:将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操作流程(仅提供第一步代码,第二步是一样的哈)
大致步骤:
- 使用
require
提供的函数context
加载某一个目录下的所有.vue
后缀的文件。 - 然后
context
函数会返回一个导入函数importFn
使用context
函数的属性keys()
获取所有的文件路径- 通过文件路径数组,通过遍历数组,再使用
importFn
根据路径导入组件对象值 - 遍历的同时进行全局注册即可
// 导入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 {};
更多推荐
已为社区贡献15条内容
所有评论(0)