vue如何動(dòng)態(tài)加載組件詳解
使用場景:
項(xiàng)目中需要我們根據(jù)不同的業(yè)務(wù)需求呈現(xiàn)不同的業(yè)務(wù)場景,如果業(yè)務(wù)類型簡單還好,直接全部引入判斷即可,但隨著我們代碼的沉積,項(xiàng)目將會(huì)變得很難維護(hù),這時(shí)候我們可以使用動(dòng)態(tài)引入組件的方式來避免這個(gè)問題,首先第一步實(shí)現(xiàn)就是,在vue中,我們?nèi)绾蝿?dòng)態(tài)引入組件?
話不多說,直接上干貨
需要?jiǎng)討B(tài)導(dǎo)入組件的頁面
在這個(gè)頁面引入我們的組件Test
<template> <div> <Test :data="DemoData" :type="type" /> </div> </template> <script> /** @format */ import Test from '@components/demo/index.vue' export default { components: { Test }, data() { return { type: 'demo2', DemoData: 'demoData' } }, } </script>
組件庫文件夾格式根據(jù)自己的喜好來設(shè)置
核心組件的代碼:
<template> <component :is="component" v-if="component" /> </template> <script> /** @format */ export default { name: 'test', props: ['data', 'type'], data() { return { component: null } }, computed: { loader() { return () => import(`@components/demo/demoTemplates/${type}`) } }, mounted() { this.loader() .then(() => { this.component = () => this.loader() }) .catch(() => { this.component = () => import('@components/demo/demoTemplates/defaultDemo') }) } } </script>
這樣就可以動(dòng)態(tài)加載組件了
利用的原理知識是es6新增的inport()函數(shù)
ES2020提案 引入import()函數(shù),支持動(dòng)態(tài)加載模塊。
import()返回一個(gè) Promise 對象。下面是一個(gè)例子。
const main = document.querySelector('main'); import(`./section-modules/${someVariable}.js`) .then(module => { module.loadPageInto(main); }) .catch(err => { main.textContent = err.message; });
import()函數(shù)可以用在任何地方,不僅僅是模塊,非模塊的腳本也可以使用。它是運(yùn)行時(shí)執(zhí)行,也就是說,什么時(shí)候運(yùn)行到這一句,就會(huì)加載指定的模塊。另外,import()函數(shù)與所加載的模塊沒有靜態(tài)連接關(guān)系,這點(diǎn)也是與import語句不相同。import()類似于 Node 的require方法,區(qū)別主要是前者是異步加載,后者是同步加載。
使用場景:
(1)按需加載。
import()可以在需要的時(shí)候,再加載某個(gè)模塊。
button.addEventListener('click', event => { import('./dialogBox.js') .then(dialogBox => { dialogBox.open(); }) .catch(error => { /* Error handling */ }) });
上面代碼中,import()方法放在click事件的監(jiān)聽函數(shù)之中,只有用戶點(diǎn)擊了按鈕,才會(huì)加載這個(gè)模塊。
動(dòng)態(tài)的模塊路徑
import()允許模塊路徑動(dòng)態(tài)生成。
import(f()) .then(...);
上面代碼中,根據(jù)函數(shù)f的返回結(jié)果,加載不同的模塊。
注意點(diǎn):
import()加載模塊成功以后,這個(gè)模塊會(huì)作為一個(gè)對象,當(dāng)作then方法的參數(shù)。因此,可以使用對象解構(gòu)賦值的語法,獲取輸出接口。
import('./myModule.js') .then(({export1, export2}) => { // ...· });
上面代碼中,export1和export2都是myModule.js的輸出接口,可以解構(gòu)獲得。
如果模塊有default輸出接口,可以用參數(shù)直接獲得。
import('./myModule.js') .then(myModule => { console.log(myModule.default); });
上面的代碼也可以使用具名輸入的形式。
import('./myModule.js') .then(({default: theDefault}) => { console.log(theDefault); });
如果想同時(shí)加載多個(gè)模塊,可以采用下面的寫法。
Promise.all([ import('./module1.js'), import('./module2.js'), import('./module3.js'), ]) .then(([module1, module2, module3]) => { ··· });
import()也可以用在 async 函數(shù)之中。
async function main() { const myModule = await import('./myModule.js'); const {export1, export2} = await import('./myModule.js'); const [module1, module2, module3] = await Promise.all([ import('./module1.js'), import('./module2.js'), import('./module3.js'), ]); } main();
import()方法詳細(xì)介紹參考:https://es6.ruanyifeng.com/#docs/module
總結(jié)
到此這篇關(guān)于vue如何動(dòng)態(tài)加載組件的文章就介紹到這了,更多相關(guān)vue動(dòng)態(tài)加載組件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- vue3動(dòng)態(tài)加載組件以及動(dòng)態(tài)引入組件詳解
- Vue3的setup在el-tab中動(dòng)態(tài)加載組件的方法
- vue2.* element tabs tab-pane 動(dòng)態(tài)加載組件操作
- vue組件(全局,局部,動(dòng)態(tài)加載組件)
- Vue加載組件、動(dòng)態(tài)加載組件的幾種方式
- vue3+vite項(xiàng)目中按需引入vant報(bào)錯(cuò):Failed?to?resolve?import的解決方案
- vue3+vite引入插件unplugin-auto-import的方法
- Vue?import?from省略后綴/加載文件夾的方法/實(shí)例詳解
- 在Vue中使用動(dòng)態(tài)import()語法動(dòng)態(tài)加載組件
相關(guān)文章
Vue+better-scroll 實(shí)現(xiàn)通訊錄字母索引的示例代碼
通訊錄字母索引是常用的一種功能,本文主要介紹了Vue+better-scroll 實(shí)現(xiàn)通訊錄字母索引,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06解決VUE中document.body.scrollTop為0的問題
今天小編就為大家分享一篇解決VUE中document.body.scrollTop為0的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09vue實(shí)現(xiàn)移動(dòng)端輕量日期組件不依賴第三方庫的方法
這篇文章主要介紹了vue 移動(dòng)端輕量日期組件不依賴第三方庫,需要的朋友可以參考下2019-04-04Vue3之Vite中由element?ui更新導(dǎo)致的啟動(dòng)報(bào)錯(cuò)解決
這篇文章主要介紹了Vue3之Vite中由element?ui更新導(dǎo)致的啟動(dòng)報(bào)錯(cuò)解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01vue-cli3項(xiàng)目展示本地Markdown文件的方法
這篇文章主要介紹了vue-cli3項(xiàng)目展示本地Markdown文件的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06vue 使用插槽分發(fā)內(nèi)容操作示例【單個(gè)插槽、具名插槽、作用域插槽】
這篇文章主要介紹了vue 使用插槽分發(fā)內(nèi)容操作,結(jié)合實(shí)例形式總結(jié)分析了vue.js使用單個(gè)插槽、具名插槽、作用域插槽相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2020-03-03