vue动态注册组件
vue的架构思想,其实就是想按组件化开发,提升前端的模块复用性,因此在开发过程中,组件的嵌套是很正常的需求。
例如以下需求:
在Index.vue页面想调用组件A,A的页面有两种样式,分别为B,和C,想在Index.vue调用两个A组件,并且A组件包含有B和C样式。
那么在开发的时候,我习惯把B和C的样式和事件分别封装为B组件和C组件,如下图:

这个需求要求我们在Index.vue页面传递参数给A组件,然后A组件通过参数决定是调用B组件还是C组件,代码如下
Index.vue:
<template>
<div class="Index">
<div class="box"><A comChilds="C"></A></div>
<div class="box"><A comChilds="B"></A></div>
</div>
</template>
<script>
import A from "@/components/A";
export default {
name: "Index",
data() {
return {
};
},
components: {
A: A
}
};
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.Index{width: 800px;border:solid 1px #000;display: flex;text-align: center}
.box{width: 300px;margin:10px 25px }
</style>
组件A的:
<template>
<div>
<div>父类组件A</div>
<component :is="apps"></component>
</div>
</template>
<script>
import Vue from "vue";
export default {
name: "A",
data() {
return {
Child: this.comChilds,
apps: {}
};
},
props: {
comChilds: {
type: String
}
},
beforeMount() {
this.apps=() => import('./common/' + this.Child + '.vue')
}
};
</script>
<style scoped>
</style>
组件B:
<template>
<div>我是A组件下的子组件B</div>
</template>
<script>
export default {
}
</script>
<style scoped>
</style>
组件C:
<template>
<div>我是A组件下的子组件C</div>
</template>
<script>
export default {
}
</script>
<style scoped>
</style>
补充说明:
A组件中的:this.apps=() => import('./common/' + this.Child + '.vue')作用为:动态加载,可以使用
this.apps=resolve => require.ensure([], () => resolve(require('./common/' + this.Child + '.vue')));代替
也可以使用
this.apps=require("./common/"+this.Child+".vue").default代替
生命周期(钩子):beforeMount也可以使用created代替,可以查看VUE的API生命周期

浙公网安备 33010602011771号