vue Tab切换以及缓存页面处理的几种方式


Posted in Javascript onNovember 05, 2019

前言

相信tab切换对于大家来说都不算陌生,后台管理系统中多会用到。如果不知道的话,可以看一下浏览器上方的标签页切换,大概效果就是这样。

1.如何切换

使用动态组件,相信大家都能看懂(部分代码省略)

//通过点击就可以实现两个组件来回切换
<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
 }
}
注:这个多用于单页下的几个子模块使用,一般切换比较多使用下面的路由

使用路由(这个就是配置路由的问题了,不作赘述)2.动态生成tab

一般UI框架给我们的tab切换都像是上面的那种,需要自己写入几个tab页之类的配置。但是我们如果想要通过点击左边的目录来生成一个tab页并且可以随时关闭呢(如下图)?

vue Tab切换以及缓存页面处理的几种方式

只需要给路由一个点击事件,把你的路由地址保存到一个列表,渲染成另一个平铺的tab目录即可

假设你的布局是这样,左边的目录,上边的tab,有字的是页面

vue 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>
以上代码并非实际代码,只提供一个大概的思路。至于addToTabListdeleteTab怎么做就是数组方法的简单pushsplice操作了。为了效果好看,我们可能还需要一些tabactive样式,这里不作演示。

3.缓存组件

仅仅是做tab切换,远远是不够的,毕竟大家想要tab页就是要来回切换操作,我们需要保存他在不同tab里操作的进度,比如说填写的表单信息,或者已经查询好的数据列表等。
那么我们要怎么缓存组件呢?
只需要用到vue中的keep-alive组件

3.1 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>

3.2 使用

3.2.1 老版本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 // 需要被缓存
   }
  }
 ]
})

3.2.2 比较新而且简单的用法

直接缓存所有组件/路由

<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里的组件不会被缓存。用法类似,不作赘述

3.2.3 一种比较奇怪的情况

当页面跳转方式有A->CB->C两种,但是我们从A到C的时候,不需要缓存,从B到C的时候需要缓存。这时候就要用到路由的钩子结合老版本用法来实现了。

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();
 }
};

3.3 缓存组件的生命周期函数

缓存组件第一次打开的时候,和普通组件一样,也需要执行created, mounted等函数。
但是在被再次激活被停用时,这几个普通组件的生命周期函数都不会执行,会执行两个比较独特的生命周期函数。

activated
这个会在缓存的组件重新激活时调用

deactivated
这个会在缓存的组件停用时调用

结语

这个是很基础的知识,放在笔记里很久了,不过之前记得有点乱,今天拿出来抖一下尘~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery判断单个复选框是否被选中的代码
Sep 03 Javascript
基于Jquery的温度计动画效果
Jun 18 Javascript
javascript生成随机数的方法
May 16 Javascript
使用angularjs创建简单表格
Jan 21 Javascript
Phaser.js实现简单的跑酷游戏附源码下载
Oct 26 Javascript
微信端调取相册和摄像头功能,实现图片上传,并上传到服务器
May 16 Javascript
Nuxt默认模板、默认布局和自定义错误页面的实现
May 11 Javascript
element中el-container容器与div布局区分详解
May 13 Javascript
JS如何判断对象是否包含某个属性
Aug 29 Javascript
vue iview 隐藏Table组件里的某一列操作
Nov 13 Javascript
vue 授权获取微信openId操作
Nov 13 Javascript
JavaScript实现瀑布流布局的3种方式
Dec 27 Javascript
vue动态路由:路由参数改变,视图不更新问题的解决
Nov 05 #Javascript
vue 解决路由只变化参数页面组件不更新问题
Nov 05 #Javascript
vue 实现路由跳转时更改页面title
Nov 05 #Javascript
Node.js开发之套接字(socket)编程入门示例
Nov 05 #Javascript
小程序识别身份证,银行卡,营业执照,驾照的实现
Nov 05 #Javascript
node.js域名解析实现方法详解
Nov 05 #Javascript
node.js文件操作系统实例详解
Nov 05 #Javascript
You might like
介绍php设计模式中的工厂模式
2008/06/12 PHP
destoon供应信息title调用出公司名称的方法
2014/08/22 PHP
Zend Framework动作助手FlashMessenger用法详解
2016/03/05 PHP
php将一维数组转换为每3个连续值组成的二维数组
2016/05/06 PHP
showModelessDialog()使用详解
2006/09/21 Javascript
修改jQuery.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
2009/10/11 Javascript
javascript制作的网页侧边弹出框思路及实现代码
2014/05/21 Javascript
JavaScript数组函数unshift、shift、pop、push使用实例
2014/08/27 Javascript
JavaScript极简入门教程(一):基础篇
2014/10/25 Javascript
Javascript 中创建自定义对象的方法汇总
2014/12/04 Javascript
node.js中的querystring.stringify方法使用说明
2014/12/10 Javascript
jQuery中children()方法用法实例
2015/01/07 Javascript
JavaScript中的splice()方法使用详解
2015/06/09 Javascript
javascript表单验证大全
2015/08/12 Javascript
chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
2015/10/09 Javascript
jQuery+css实现的时钟效果(兼容各浏览器)
2016/01/27 Javascript
js获取页面及个元素高度、宽度的代码
2016/04/26 Javascript
jstree的简单实例
2016/12/01 Javascript
详解ECharts使用心得总结
2016/12/06 Javascript
使用gulp搭建本地服务器并实现模拟ajax
2017/04/05 Javascript
vue.js 使用v-if v-else发现没有执行解决办法
2017/05/15 Javascript
js根据json数据中的某一个属性来给数据分组的方法
2018/10/08 Javascript
使用koa2创建web项目的方法步骤
2019/03/12 Javascript
浅谈Vue 自动化部署打包上线
2020/06/14 Javascript
尝试用最短的Python代码来实现服务器和代理服务器
2016/06/23 Python
Linux下安装python3.6和第三方库的教程详解
2018/11/09 Python
详解如何管理多个Python版本和虚拟环境
2019/05/10 Python
python列表,字典,元组简单用法示例
2019/07/11 Python
基于Python安装pyecharts所遇的问题及解决方法
2019/08/12 Python
CSS+jQuery+PHP+MySQL实现的在线答题功能
2015/04/25 HTML / CSS
如何写一个Java类既可以用作applet也可以用作java应用
2016/01/18 面试题
高中数学教师求职信
2013/10/30 职场文书
希特勒的演讲稿
2014/05/23 职场文书
2014副局长群众路线对照检查材料思想汇报
2014/09/22 职场文书
亲属关系公证书样本
2015/01/23 职场文书
心灵捕手观后感
2015/06/02 职场文书