vue动态加载组件

在工作中遇到这么一个需求,就是根据所选的数据,动态显示对应的组件。

当时就不想引入import一堆的组件,想传入组件名就能显示组件,百度之后果然找到对应的方法,那就是require.context。

由于涉及到业务,所以我就创建一个简单的demo,能看到怎么使用即可。先看一下项目结构,如图1所示。

图1 目录结构图

看一下index.js里的内容,代码如下:

const resultComps = {}
let requireComponent = require.context(
    './', // 在当前目录下查找
    false, // 不遍历子文件夹
    /\.vue$/ // 正则匹配 以 .vue结尾的文件
  )
  requireComponent.keys().forEach(fileName => {
    let comp = requireComponent(fileName)
    resultComps[fileName.replace(/^\.\/(.*)\.\w+$/, '$1')] = comp.default
  })
  export default resultComps

在需要引入组件的vue页面引入index.js,我以Appvue为例,代码如下:

<template>
    <div id="app">
        <div style="line-height: 50px;">
            俺是父组件
        </div>
        <div>
            这是引入的子组件:
            <div style="line-height: 50px;border: 1px red solid;">
                <component v-for="comp in comps" :key="comp.id" :is="allComps[comp]"></component>
            </div>
        </div>
        
    </div>
</template>

<script>
    import allComps from './components/index.js'
    export default {
        name: 'app',
        data() {
            return {
                // 此处组件名即文件名
                comps: ['demo1', 'demo2', 'demo3'],
                allComps: allComps
            }
        }
    }
</script>

<style></style>

效果如图2所示

图2 演示图

   本篇到此就结束了

 

posted @ 2021-07-31 23:56  yyzhiqiu  阅读(2531)  评论(0编辑  收藏  举报