1、动态组件
1.1、组件切换
分别创建3个组件AComponent.vue、BComponent.vue、CComponent.vue,并且在A中引用B和C
代码分别如下:
AComponent.vue
,这里是通过component 标签
中的is
属性来控制不同组件内容的显示
<template>
<div>
动态组件:
<button @click="showB">显示B</button>
<button @click="showC">显示C</button>
<component :is="currentComponent"></component>
</div>
</template>
<script>
import BComponent from './child/BComponent'
import CComponent from './child/CComponent'
export default {
name: "AComponent",
data(){
return{
currentComponent:BComponent
}
},
components:{
BComponent,
CComponent
},
methods:{
showB(){
this.currentComponent=BComponent
},
showC(){
this.currentComponent=CComponent
}
}
}
</script>
<style scoped>
</style>
BComponent.vue
<template>
<div>
组件B
</div>
</template>
<script>
export default {
name: "BComponent"
}
</script>
<style scoped>
</style>
CComponent.vue
<template>
<div>
组件C
</div>
</template>
<script>
export default {
name: "CComponent"
}
</script>
<style scoped>
</style>
在App.vue中引入<AComponent />
,访问浏览器,可以看到,在组件A
中通过按钮实现了组件B
和组件C
的动态切换
1.2、keep alive缓存
我们修改CComponent.vue
的代码,增加一个赋值操作
<template>
<div>
组件C:{{ msg }}
<button @click="changeMsg">更新</button>
</div>
</template>
<script>
export default {
name: "CComponent",
data(){
return{
msg:"C的原始数据"
}
},
methods:{
changeMsg(){
this.msg = "C的更新数据"
}
}
}
</script>
<style scoped>
</style>
当我们点击【更新】按钮后,组件C渲染的数据会变成C的更新数据
,但是我们再次切换【显示B】和【显示C】按钮时,组件C渲染的数据会重新变成C的原始数据
,原因是每次切换新标签的时候,Vue 都创建了一个新的 currentComponent实例
。
那么如果我们希望第一次被创建的实例效果保存下来,则需要使用<keep-alive>
元素将其动态组件包裹起来,进行缓存。
修改AComponent.vue
中的如下代码即可
<keep-alive>
<component :is="currentComponent"></component>
</keep-alive>
2、异步组件
使用异步组件需要修改import方式,比如修改import CComponent from './child/CComponent'
导入方式为如下,CComponent
则变成异步渲染
const CComponent = () => import("./child/CComponent");