vite5+vue3+?import.meta.glob動(dòng)態(tài)導(dǎo)入vue組件圖文教程
前言
import.meta.glob 是 Vite 提供的一個(gè)特殊功能,它允許你在模塊范圍內(nèi)動(dòng)態(tài)地導(dǎo)入多個(gè)模塊。這在處理大量的文件,如組件、頁(yè)面或其他模塊時(shí)特別有用,特別是當(dāng)你需要根據(jù)某些條件或模式來(lái)動(dòng)態(tài)加載它們時(shí)。
創(chuàng)建需要?jiǎng)討B(tài)導(dǎo)入的組件目錄
假設(shè)你有一個(gè)src/pages/DynamicComponents目錄,里面包含多個(gè) Vue 組件,你想根據(jù)某些條件動(dòng)態(tài)地導(dǎo)入這些組件。
首先,確保你的目錄結(jié)構(gòu)是這樣的:
src/pages/index.vue文件
<template> <div class="DynamicComponentsOutbox"> <h1>DynamicComponents</h1> </div> <div> <component v-for="(component, name) in dynamicComponents" :key="name" :is="component" /> </div> </template> <script setup> import { onMounted, reactive,markRaw } from 'vue' const dynamicComponents = reactive({}) onMounted(async () => { const modules = import.meta.glob('./DynamicComponents/*.vue'); for (const path in modules) { const module = await modules[path](); const componentName = path.replace(/^\.\/components\/(.*)\.vue$/, '$1'); console.log(`componentName`,componentName ); dynamicComponents[componentName] = markRaw(module.default) } console.log(`dynamicComponents`,dynamicComponents); }) </script> <style lang="scss" scoped></style>
src/pages/DynamicComponents/ComponentA.vue文件
<template> <div class=""> <h1>ComponentA</h1> </div> </template> <script setup> </script> <style lang="scss" scoped></style>
src/pages/DynamicComponents/ComponentB.vue文件
<template> <div class=""> <h1>ComponentB</h1> </div> </template> <script setup> </script> <style lang="scss" scoped> </style>
App.vue文件
<template> <main> <HelloWorld msg="You did it!" /> <component :is='DynamicComponents'></component> </main> </template> <script setup> import HelloWorld from '@/components/HelloWorld.vue' import DynamicComponents from '@/pages/index.vue' </script> <style scoped></style>
index.vue:6 [Vue warn]: Vue received a Component that was made a reactive object. This can lead to unnecessary performance overhead and should be avoided by marking the component with `markRaw` or using `shallowRef` instead of `ref`. Component that was made reactive: {__hmrId: 'ed2b2297', __file: 'C:/Users/63002/Desktop/codefile/vue3-vite2/src/pages/DynamicComponents/ComponentA.vue', render: ?} at <Index> at <App>
剛開(kāi)始這樣寫(xiě)
dynamicComponents[componentName] =module.default
這里報(bào)了一個(gè)警告:提示你去給組件使用markRaw
or shallowRef
包起來(lái)就好了,我直接使用了markRaw來(lái)包起組件 ,就解決這個(gè)警告了。
改為:
import { onMounted, reactive,markRaw } from 'vue'
dynamicComponents[componentName] = markRaw(module.default)
<template> <div class="DynamicComponentsOutbox"> <h1>DynamicComponents</h1> </div> <div> <component v-for="(component, name) in dynamicComponents" :key="name" :is="component" /> </div> </template> <script setup> import { onMounted, reactive,markRaw } from 'vue' const dynamicComponents = reactive({}) onMounted(async () => { const modules = import.meta.glob('./DynamicComponents/*.vue'); for (const path in modules) { const module = await modules[path](); const componentName = path.replace(/^\.\/components\/(.*)\.vue$/, '$1'); console.log(`componentName`,componentName ); dynamicComponents[componentName] = markRaw(module.default) } console.log(`dynamicComponents`,dynamicComponents); }) </script> <style lang="scss" scoped></style>
在上面的代碼中,我們首先在onMounted鉤子中使用 import.meta.glob
獲取 components
目錄下所有 .vue
文件的動(dòng)態(tài)導(dǎo)入。然后,我們遍歷這些模塊,加載它們,并將它們存儲(chǔ)在 dynamicComponents
對(duì)象中,其中鍵是組件的名稱(chēng)(從文件路徑中提?。?,值是組件的默認(rèn)導(dǎo)出。
最后,在模板中,我們使用 v-for
指令遍歷 dynamicComponents
對(duì)象,并使用 Vue 的動(dòng)態(tài)組件功能 (<component :is="...">
) 來(lái)渲染每個(gè)組件。
注意:由于
import.meta.glob
是在構(gòu)建時(shí)解析的,因此它不會(huì)為動(dòng)態(tài)路徑或運(yùn)行時(shí)確定的路徑工作。它主要用于靜態(tài)路徑模式。
總結(jié)
到此這篇關(guān)于vite5+vue3+ import.meta.glob動(dòng)態(tài)導(dǎo)入vue組件的文章就介紹到這了,更多相關(guān)import.meta.glob動(dòng)態(tài)導(dǎo)入vue組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue uniapp 防止按鈕多次點(diǎn)擊的三種實(shí)現(xiàn)方式
最近的項(xiàng)目完成后,在性能優(yōu)化階段需要做按鈕的防止重復(fù)點(diǎn)擊功能,本文主要介紹了vue uniapp 防止按鈕多次點(diǎn)擊的三種實(shí)現(xiàn)方式,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08Vue+Element實(shí)現(xiàn)封裝抽屜彈框
這篇文章主要為大家詳細(xì)介紹了如何利用Vue和Element實(shí)現(xiàn)簡(jiǎn)單的抽屜彈框效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-06-06Vue動(dòng)態(tài)擴(kuò)展表頭的表格及數(shù)據(jù)方式(數(shù)組嵌套對(duì)象)
這篇文章主要介紹了Vue動(dòng)態(tài)擴(kuò)展表頭的表格及數(shù)據(jù)方式(數(shù)組嵌套對(duì)象),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03ElementUI 修改默認(rèn)樣式的幾種辦法(小結(jié))
這篇文章主要介紹了ElementUI 修改默認(rèn)樣式的幾種辦法(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07如何用Vite構(gòu)建工具快速創(chuàng)建Vue項(xiàng)目
Vite是一個(gè)web開(kāi)發(fā)構(gòu)建工具,由于其原生?ES?模塊導(dǎo)入方法,它允許快速提供代碼,下面這篇文章主要給大家介紹了關(guān)于如何用Vite構(gòu)建工具快速創(chuàng)建Vue項(xiàng)目的相關(guān)資料,需要的朋友可以參考下2022-05-05Vue自定義詢(xún)問(wèn)彈框和輸入彈框的示例代碼
這篇文章主要介紹了Vue自定義詢(xún)問(wèn)彈框和輸入彈框,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06antd Select下拉菜單動(dòng)態(tài)添加option里的內(nèi)容操作
這篇文章主要介紹了antd Select下拉菜單動(dòng)態(tài)添加option里的內(nèi)容操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11Vue終端取消vue、prettier警告warn問(wèn)題
這篇文章主要介紹了Vue終端取消vue、prettier警告warn問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10使用Mockjs模擬接口實(shí)現(xiàn)增刪改查、分頁(yè)及多條件查詢(xún)
Mock.js是一個(gè)模擬數(shù)據(jù)生成器,可以讓前端獨(dú)立于后端進(jìn)行開(kāi)發(fā),下面這篇文章主要給大家介紹了關(guān)于使用Mockjs模擬接口實(shí)現(xiàn)增刪改查、分頁(yè)及多條件查詢(xún)的相關(guān)資料,需要的朋友可以參考下2022-04-04