让多个组件使用同一个挂载点,并动态切换,这就是动态组件。
通过使用保留的 <component>
元素,动态地绑定到它的 is 特性,可以实现动态组件。
方式一:局部注册所需组件
<div id="example"> button @click="change">切换页面</buttoncomponent :is="currentView"></component> div>
script> var home = {template:'<div>我是主页</div>}; post <div>我是提交页</div> archive <div>我是存档页</div>new Vue({ el: #example,components: { home,post,archive,},data:{ index:0homepostarchive],computed:{ currentView(){ return this.arr[.index]; } },methods:{ change(){ .index (++.index)%3; } } }) >
使用<keep-alive>缓存
<keep-alive>
包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。和 <transition>
相似,<keep-alive>
是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在父组件链中。
基本用法:
keep-alive> > >
如果有多个条件性的子元素,<keep-alive>
要求同时只有一个子元素被渲染:
home v-if="index===0"homeposts v-else-if="index===1"postsarchive v-elsearchive<div>我是主页/div>`}, posts:{template:`我是提交页 archive:{template:`我是存档页 },methods:{ change(){ let len Object.keys(.$options.components).length; len; } } }) >
activated 和 deactivated
activated
和 deactivated
在 <keep-alive>
树内的所有嵌套组件中触发:
="currentView" @pass-data="getData"> p>{{msg}}''div>`,1)"> activated(){ .$emit(pass-data主页被添加); },deactivated(){ 主页被移除 {template:`div>`} ],1)"> len = .arr.length; len; },getData(value){ .msg value; setTimeout(()=>{ ; },1)">500) } } }) >
include和exclude
include
和exclude
属性允许组件有条件地缓存。二者都可以用逗号分隔字符串、正则表达式或一个数组来表示:
<!-- 逗号分隔字符串 --> keep-alive include="a,b"="view" 正则表达式 (使用 v-bind) :include="/a|b/" Array (use v-bind) ="['a','b']">
匹配首先检查组件自身name选项,如果name选项不可用,则匹配它的局部注册名称(父组件 components 选项的键值)。匿名组件不能被匹配。
="home,archive">
上面的代码,表示只缓存home和archive,不缓存posts
方式二:动态注册组件实现
asyncComponents(templateName){ this.curNavComponents = require(`./components/${templateName}.vue`).default; }
参考地址: