vue3中批量全局注冊組件實(shí)例詳解
Vue3中批量全局祖冊組件
學(xué)習(xí)的時候順便記錄一下,用于個人學(xué)習(xí)使用vite+vue3+ts,如果想直接看批量注冊全局組件的,看文章目錄,直接點(diǎn)目錄跳轉(zhuǎn)即可
在vue中,我們在main.ts引入的全局注冊的組件是可以不需要import導(dǎo)入而直接使用的。使用的時候是自己全局注冊組件時的名稱,而不是組件名。如下圖所示的Helloword,而不是HelloWorldVue那個,具體看下圖所示就可以了


除了在main.ts中直接寫引入組件之外,我們還可以通過自己寫一個ts文件,然后在main.ts引用它,來達(dá)到全局注冊組件的目的。如下所示

index.js的代碼如下所示
import {App} from 'vue'
import HomeVue from './Home.vue';
export default {
install(app: App) {
app.component("Home", HomeVue);
}
}main.ts中的代碼如下
import { createApp } from 'vue'
import './style.css'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import App from './App.vue'
// 全局注冊組件
import HelloWorldVue from './components/HelloWorld.vue'
// 引入ts文件對應(yīng)的全局注冊的組件的配置
import components from './components/index'
const app = createApp(App)
// 全局注冊組件
app.component("Helloword",HelloWorldVue)
// 對ts文件中的全局組件進(jìn)行配置
app.use(components)
app.use(ElementPlus).mount('#app')結(jié)果如下圖所示

批量注冊全局組件
通過循環(huán)就可以批量注冊全局組件了,如下圖所示

myComponents.ts的代碼如下
import {App} from 'vue'
import HomeVue from './Home.vue';
import HelloWorldVue from './HelloWorld.vue';
/**
export default {
install(app: App) {
app.component("Home", HomeVue);
app.component("Helloword", HelloWorldVue)
}
}
*/
const components = [
{title: 'Home', componentName: HomeVue},
{title: 'Helloword', componentName: HelloWorldVue}
]
export default {
install(app: App) {
components.forEach(item => {
// 通過循環(huán)遍歷數(shù)據(jù)批量注冊組件
app.component(item.title, item.componentName)
})
}
}main.ts的代碼如下:
import { createApp } from 'vue'
import './style.css'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import App from './App.vue'
// 引入ts文件對應(yīng)的全局注冊的組件的配置
import components from './components/myComponents'
const app = createApp(App)
// 對ts文件中的全局組件進(jìn)行配置
app.use(components)
app.use(ElementPlus).mount('#app')App.vue如下
<script setup lang="ts">
</script>
<template>
<div id="app">
<Helloword></Helloword>
<hr>
<Home></Home>
</div>
</template>
<style scoped>
</style>結(jié)果如下圖所示

vite查找.vue 結(jié)尾的文件
但是這里還是需要我們自己手寫一個一個引入組件,然后實(shí)現(xiàn)批量導(dǎo)入,那么有沒有一種辦法就是。我讀取某一個目錄下中以(點(diǎn)).vue結(jié)尾的文件,然后將其注冊為全局組件。這樣就可以不用一個一個手動import導(dǎo)入了。我們可以利用功能 | Vite 官方中文文檔 (vitejs.dev)中提供的import.meta.glob找到以(點(diǎn)).vue結(jié)尾的文件以及相關(guān)的信息,import.meta.glob的通配符是* 或者是 **,也可以使用!進(jìn)行反選操作。
這里的./表示當(dāng)前使用了import.meta.glob的ts文件所在的目錄,具體看下面的截圖說明即可
import.meta.glob("./path/**/*.vue") 如這里:查找當(dāng)前目錄下的path目錄下和(path目錄下的子目錄中的)以(點(diǎn)).vue結(jié)尾的文件
import.meta.glob("./path/*.vue")如這里:查找當(dāng)前目錄下的path目錄下的以(點(diǎn)).vue結(jié)尾的文件,不包括子目錄中的文件
如下圖所示,這里注意看下圖中myComponents.ts文件所在的位置,以及對應(yīng)的目錄位置,我們要找的是使用了import.meta.glob(“./path/*.vue”)的ts文件對應(yīng)需要掃描的文件夾的位置。具體看下圖就知道了

console.log的結(jié)果如下所示,可以結(jié)合圖中所示的目錄看一下

如果去掉**號,那就只是找當(dāng)前目錄下的以.vue結(jié)尾的文件,如下圖所示

console.log()的結(jié)果如下所示,可以結(jié)合圖中所示的目錄看一下

如:我將myComponents.ts換一個位置,我們只需要找到對應(yīng)的位置需要掃描的文件路徑即可,如下圖所示

console.log()的結(jié)果如下,可以找到對應(yīng)的以點(diǎn).vue結(jié)尾的文件

通過 import.meta.glob("./path/**/*.vue") 的形式批量注冊全局組件
注意:這里我將myComponents.ts重新放到了components目錄下了

console.log()打印的結(jié)果如下

所以上面就相當(dāng)于如果是aaa.vue組件,則就是類似于app.component(“aaa”(這個全局注冊的名稱), aaa(這個是組件))即app.component(“aaa”,aaa)。只不過這里是動態(tài)引入而已,他們的調(diào)用關(guān)系截圖如下所示,截圖的代碼在后面


myComponents.ts的代碼如下
import {App} from 'vue'
import { defineAsyncComponent,AsyncComponentLoader } from "vue";
const componentss = import.meta.glob("./**/*.vue");
console.log(componentss)
console.log(Object.entries(componentss))
/**
* 全局組件引用管理
*/
export default {
install(app: App) {
for (let [key, value] of Object.entries(componentss)) {
// 字符串截取,具體看下面console.log()中的name就知道了
let name = key.slice(key.lastIndexOf("/") + 1, key.lastIndexOf("."));
console.log(`注意這里的name名稱=》》 ${name} ===>這個名稱,
自己作為了全局祖冊組件的名稱了,也就是如左側(cè)目錄的:aaa.vue去掉.vue就剩下aaa了
,然后那這個名稱作為組件引用的名稱,具體看截圖就知道了。這時就是相當(dāng)于跟左側(cè)
項(xiàng)目目錄的.vue結(jié)尾的文件去掉.vue得到的名稱`)
app.component(name, defineAsyncComponent(value as AsyncComponentLoader));
}
}
}main.ts代碼如下
import { createApp } from 'vue'
import './style.css'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import App from './App.vue'
// 引入ts文件對應(yīng)的全局注冊的組件的配置
import components from './components/myComponents'
const app = createApp(App)
// 對ts文件中的全局組件進(jìn)行配置
app.use(components)
app.use(ElementPlus).mount('#app')App.vue
<script setup lang="ts">
</script>
<template>
<div id="app">
<HelloWorld></HelloWorld>
<hr>
<Home></Home>
<hr>
<aaa></aaa>
<hr>
<bbb></bbb>
</div>
</template>
<style scoped>
</style>結(jié)果如下所示

這時我在components目錄下新建一個ccc.vue文件,只要我新建的組件,直接寫標(biāo)簽就行了,不再需要手動import引入了。如下圖所示

結(jié)果如下圖所示

到此這篇關(guān)于vue3中批量全局注冊組件的文章就介紹到這了,更多相關(guān)vue3全局注冊組件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue Element前端應(yīng)用開發(fā)之根據(jù)ABP后端接口實(shí)現(xiàn)前端展示
本篇著重介紹基于ABP后端接口信息,實(shí)現(xiàn)對前端界面的開發(fā)工作。2021-05-05
vue項(xiàng)目中使用fetch的實(shí)現(xiàn)方法
這篇文章主要介紹了vue項(xiàng)目中使用fetch的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
詳解Vue Elementui中的Tag與頁面其它元素相互交互的兩三事
這篇文章主要介紹了詳解Vue Elementui中的Tag與頁面其它元素相互交互的兩三事,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09

