当前位置: 首页>編程日記>正文

Vue动态引入组件

Vue动态引入组件

目录

    • 需求
    • 动态组件
    • 异步组件
    • import函数
    • 动态组件和异步组件结合实现功能
    • 拓展1-处理加载状态
    • 拓展2-require方法
      • AMD-require方法
      • webpack-require.context方法

需求

当我们的页面需要不定量的组件进行渲染时,我们可能会大量引入全部组件再使用动态组件完成需求,通过组件的动态引入减少代码量以及项目难度,我们需要掌握以下内容

动态组件

通过<component>标签上的is属性实现对组件的动态引用

<template><component :is="myComponent"></component>
</template>

is属性的属性值可以为:

  • 一个已注册过的组件的组件名
  • 一个组件的选项对象
    <template><component :is="myComponent"></component>
    </template>
    
    export default {data(){return {myComponent:{render(h){return h('h1','这是我的组件')}}}}
    }
    

异步组件

Vue允许以一个函数的方式定义组件,这个函数会在组件需要被渲染的时候触发,并将结果缓存起来以便以后重新渲染

Vue.component('MyComponent',function(resolve){// 通过resolve回调传递一个组件对象resolve({render(h){return h('h1','这是我的异步组件')}})
})

或者返回一个Promise

// 上面用全局引入的方式,这里使用局部引入的方式
export default {components:{MyComponent:function(){return new Promise(resolve=>{resolve({render:h=>h('h1','这是我的异步组件')})})}}
}

import函数

ECMAScript2020中引入import函数支持动态加载模块,参数与import命令接受的参数相同,它返回一个Promise对象

export default {methods:{handleImport(){import('./a.vue').then(data=>{console.log(data) // {default:Vue对象}})}}
}

所以我们常用的异步组件写法

export default {components:{MyComponent:()=>import('./my-component.vue')}
}

import函数允许动态路径,但注意不能是纯动态的

例如import(foo),这样完全动态的加载方式将会失败,因为webpack需要一些文件位置信息。因为变量foo可能是系统或项目中任何文件的路径。import()必须至少包含关于模块所在位置的一些信息,因此让捆绑可以局限于特定的目录或文件夹。

内容参考自vue动态组件找不到module问题,import不能接收动态参数

所以我们可以使用以下方式进行动态引入

let fileName="user"
import('@/components/'+fileName+'.vue')

动态组件和异步组件结合实现功能

<template><component v-if="dynamicComponent" :is="dynamicComponent"></component>
</template>
export default {computed:{dynamicComponent(){// 这里通过路由参数判断引入文件let filename=this.$route.params.filenameif(filename){return ()=>import('@/components/dynamic-components/'+filename+'.vue')}else{return null}}}
}

拓展1-处理加载状态

异步组件函数也可以返回一个对象

export default {components:{MyComponent:()=>({// 需要加载的组件 (应该是一个 `Promise` 对象)component: import('./MyComponent.vue'),// 异步组件加载时使用的组件(同步组件)loading: LoadingComponent,// 加载失败时使用的组件(同步组件)error: ErrorComponent,// 展示加载时组件的延时时间。默认值是 200 (毫秒),即200毫秒后开始显示加载中组件delay: 200,// 如果提供了超时时间且组件加载也超时了,// 则使用加载失败时使用的组件。默认值是:`Infinity`timeout: 3000})}
}

拓展2-require方法

webpack支持require方法

AMD-require方法

require((paths:Array\<String\>[,callback:Function]))方法链接
paths:引入的文件列表
callback:回调函数

我们也可以结合resolve回调实现异步组件

Vue.component('MyComponent',resolve=>{require(['@/components/my-component.vue'],resolve)
})

webpack-require.context方法

require.context(directory:String[,includeSubdirs:Boolean][,filter:RegExp][,mode:String])方法链接
directory:组件目录的相对路径
includeSubdirs:是否查询子目录
filter:组件名匹配的正则表达式
mode:可用模式,默认值’sync’

通过require.context方法检查组件是否存在

var context=require.context('@/components',false,/\.vue$/)
var keys=context.keys()// ['./user.vue','./game.vue','./city.vue']
var moduleName=keys.find(key=>key.replace(/(^\.\/)|(\.vue$)/g,'')==this.$route.params.module)
var myComponent=moduleName?context(moduleName).default:null


https://www.fengoutiyan.com/post/14531.html

相关文章:

  • vue如何点击时动态加载组件
  • 小程序怎么引用组件
  • vue引入外部js方法
  • 微信小程序引入组件
  • 小程序自定义组件生命周期
  • su动态组件有什么用
  • 组件当中的组件
  • vue动态添加组件渲染
  • 鏡像模式如何設置在哪,圖片鏡像操作
  • 什么軟件可以把圖片鏡像翻轉,C#圖片處理 解決左右鏡像相反(旋轉圖片)
  • 手機照片鏡像翻轉,C#圖像鏡像
  • 視頻鏡像翻轉軟件,python圖片鏡像翻轉_python中鏡像實現方法
  • 什么軟件可以把圖片鏡像翻轉,利用PS實現圖片的鏡像處理
  • 照片鏡像翻轉app,java實現圖片鏡像翻轉
  • 什么軟件可以把圖片鏡像翻轉,python圖片鏡像翻轉_python圖像處理之鏡像實現方法
  • matlab下載,matlab如何鏡像處理圖片,matlab實現圖像鏡像
  • 圖片鏡像翻轉,MATLAB:鏡像圖片
  • 鏡像翻轉圖片的軟件,圖像處理:實現圖片鏡像(基于python)
  • canvas可畫,JavaScript - canvas - 鏡像圖片
  • 圖片鏡像翻轉,UGUI優化:使用鏡像圖片
  • Codeforces,CodeForces 1253C
  • MySQL下載安裝,Mysql ERROR: 1253 解決方法
  • 勝利大逃亡英雄逃亡方案,HDU - 1253 勝利大逃亡 BFS
  • 大一c語言期末考試試題及答案匯總,電大計算機C語言1253,1253《C語言程序設計》電大期末精彩試題及其問題詳解
  • lu求解線性方程組,P1253 [yLOI2018] 扶蘇的問題 (線段樹)
  • c語言程序設計基礎題庫,1253號C語言程序設計試題,2016年1月試卷號1253C語言程序設計A.pdf
  • 信奧賽一本通官網,【信奧賽一本通】1253:抓住那頭牛(詳細代碼)
  • c語言程序設計1253,1253c語言程序設計a(2010年1月)
  • 勝利大逃亡英雄逃亡方案,BFS——1253 勝利大逃亡
  • 直流電壓測量模塊,IM1253B交直流電能計量模塊(艾銳達光電)
  • c語言程序設計第三版課后答案,【渝粵題庫】國家開放大學2021春1253C語言程序設計答案
  • 18轉換為二進制,1253. 將數字轉換為16進制
  • light-emitting diode,LightOJ-1253 Misere Nim
  • masterroyale魔改版,1253 Dungeon Master
  • codeformer官網中文版,codeforces.1253 B
  • c語言程序設計考研真題及答案,2020C語言程序設計1253,1253計算機科學與技術專業C語言程序設計A科目2020年09月國家開 放大學(中央廣播電視大學)
  • c語言程序設計基礎題庫,1253本科2016c語言程序設計試題,1253電大《C語言程序設計A》試題和答案200901
  • 肇事逃逸車輛無法聯系到車主怎么辦,1253尋找肇事司機