相信tab切换对于你们来讲都不算陌生,后台管理系统中多会用到。若是不知道的话,能够看一下浏览器上方的标签页切换,大概效果就是这样。vue
使用动态组件,相信你们都能看懂(部分代码省略)数组
//经过点击就能够实现两个组件来回切换 <button @click="changeView">切换view</button> <component :is="currentView"></component> import pageA from "@/views/pageA"; import pageB from "@/views/pageB"; computed: { currentView(){ return this.viewList[this.index]; } }, methods: { changeView() { this.index=(++this.index)%2 } }
注:这个多用于单页下的几个子模块使用,通常切换比较多使用下面的路由
通常UI框架给咱们的tab切换都像是上面的那种,须要本身写入几个tab页之类的配置。可是咱们若是想要经过点击左边的目录来生成一个tab页而且能够随时关闭呢(以下图)?浏览器
只须要给路由一个点击事件,把你的路由地址保存到一个列表,渲染成另外一个平铺的tab目录便可缓存
假设你的布局是这样,左边的目录,上边的tab,有字的是页面框架
<menu> <menu-item v-for="(item,index) in menuList" :key="index" @click="addToTabList(item.path)"> <router-link :to="item.path">{{item.name}}</router-link> <menu-item> </menu>
<template> <menu class="left"/>//menu代码部分如上 <div class="right"> <tab-list> <tab-item v-for="(item,index) in tabList" :key="index"> <router-link :to="item.path">{{item.name}}</router-link> <icon class="delete" @click="deleteTab"></icon> </tab-item> </tab-list> <page-view> <router-view></router-view>//这里是页面展现 </page-view> </div> </template>
以上代码并不是实际代码,只提供一个大概的思路。至于addToTabList
和deleteTab
怎么作就是数组方法的简单push
和splice
操做了。为了效果好看,咱们可能还须要一些tab
的active
样式,这里不做演示。
仅仅是作tab切换,远远是不够的,毕竟你们想要tab页就是要来回切换操做,咱们须要保存他在不一样tab里操做的进度,好比说填写的表单信息,或者已经查询好的数据列表等。
那么咱们要怎么缓存组件呢?
只须要用到vue中的keep-alive组件
函数
<keep-alive>
是Vue的内置组件,能在组件切换过程当中将状态保留在内存中,防止重复渲染DOM。<keep-alive>
包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。<keep-alive>
与 <transition>
类似,只是一个抽象组件,它不会在DOM树中渲染(真实或者虚拟都不会),也不在父组件链中存在,好比:你永远在 this.$parent
中找不到 keep-alive
。
注:不能使用
keep-alive
来缓存固定组件,会无效
//无效 <keep-alive> <my-component></my-component> </keep-alive>
vue 2.1
以前的使用<keep-alive> <router-view v-if="$route.meta.keepAlive"></router-view> </keep-alive> <router-view v-if="!$route.meta.keepAlive"></router-view>
须要在路由信息里面设置router
的元信息meta
布局
export default new Router({ routes: [ { path: '/a', name: 'A', component: A, meta: { keepAlive: false // 不须要缓存 } }, { path: '/b', name: 'B', component: B, meta: { keepAlive: true // 须要被缓存 } } ] })
<keep-alive> <router-view/> </keep-alive> <keep-alive> <component :is="view"></component> </keep-alive>
include
来处理须要缓存的组件/路由include
有几种用法,能够是数组,字符串用标点隔开,也能够是正则,使用正则的时候须要使用v-bind
来绑定。
<keep-alive include="['a','b']">//缓存name为a,b的组件 <keep-alive include ="a,b">//缓存name为a,b的组件 <keep-alive :include="/^store/">//缓存name以store开头的组件 <router-view/>//能够为router-view <component :is="view"></component>//也能够是动态组件 </keep-alive>
exclude
来排除不须要缓存的路由跟include
正好相反,在exclude
里的组件不会被缓存。用法相似,不做赘述
当页面跳转方式有A->C
和B->C
两种,可是咱们从A到C的时候,不须要缓存,从B到C的时候须要缓存。这时候就要用到路由的钩子结合老版本用法来实现了。this
export default { data() { return {}; }, methods: {}, beforeRouteLeave(to, from, next) { to.meta.keepAlive = false; // 让下一页不缓存 next(); } };
export default { data() { return {}; }, methods: {}, beforeRouteLeave(to, from, next) { // 设置下一个路由的 meta to.meta.keepAlive = true; //下一页缓存 next(); } };
缓存组件第一次
打开的时候,和普通组件同样,也须要执行created
, mounted
等函数。
可是在被再次激活
和被停用
时,这几个普通组件的生命周期函数都不会执行,会执行两个比较独特的生命周期函数。spa
这个是很基础的知识,放在笔记里好久了,不过以前记得有点乱,今天拿出来抖一下尘~
若是有建议或者有不对的地方,请在评论区指出,谢谢你们。3d