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生命周期