深入理解vue-router之keep-alive


Posted in Javascript onAugust 31, 2017

本文基于 Vue2.0

keep-alive 简介

keep-alive 是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。

用法也很简单:

<keep-alive>
 <component>
  <!-- 该组件将被缓存! -->
 </component>
</keep-alive>

props

  • include - 字符串或正则表达,只有匹配的组件会被缓存
  • exclude - 字符串或正则表达式,任何匹配的组件都不会被缓存
// 组件 a
export default {
 name: 'a',
 data () {
  return {}
 }
}
<keep-alive include="a">
 <component>
  <!-- name 为 a 的组件将被缓存! -->
 </component>
</keep-alive>可以保留它的状态或避免重新渲染
<keep-alive exclude="a">
 <component>
  <!-- 除了 name 为 a 的组件都将被缓存! -->
 </component>
</keep-alive>可以保留它的状态或避免重新渲染

遇见 vue-router

router-view 也是一个组件,如果直接被包在 keep-alive 里面,所有路径匹配到的视图组件都会被缓存:

<keep-alive>
  <router-view>
    <!-- 所有路径匹配到的视图组件都会被缓存! -->
  </router-view>
</keep-alive>

然而产品汪总是要改需求,拦都拦不住...

问题

如果只想 router-view 里面某个组件被缓存,怎么办?

  • 使用 include/exclude
  • 增加 router.meta 属性

使用 include/exclude

// 组件 a
export default {
 name: 'a',
 data () {
  return {}
 }
}
<keep-alive include="a">
  <router-view>
    <!-- 只有路径匹配到的视图 a 组件会被缓存! -->
  </router-view>
</keep-alive>

exclude 例子类似。

缺点:需要知道组件的 name,项目复杂的时候不是很好的选择

增加 router.meta 属性

// routes 配置
export default [
 {
  path: '/',
  name: 'home',
  component: Home,
  meta: {
   keepAlive: true // 需要被缓存
  }
 }, {
  path: '/:id',
  name: 'edit',
  component: Edit,
  meta: {
   keepAlive: false // 不需要被缓存
  }
 }
]
<keep-alive>
  <router-view v-if="$route.meta.keepAlive">
    <!-- 这里是会被缓存的视图组件,比如 Home! -->
  </router-view>
</keep-alive>

<router-view v-if="!$route.meta.keepAlive">
  <!-- 这里是不被缓存的视图组件,比如 Edit! -->
</router-view>

优点:不需要例举出需要被缓存组件名称

【加盐】使用 router.meta 拓展

假设这里有 3 个路由: A、B、C。

需求:

  • 默认显示 A
  • B 跳到 A,A 不刷新
  • C 跳到 A,A 刷新

实现方式

在 A 路由里面设置 meta 属性:

{
  path: '/',
  name: 'A',
  component: A,
  meta: {
    keepAlive: true // 需要被缓存
  }
}

在 B 组件里面设置 beforeRouteLeave:

export default {
  data() {
    return {};
  },
  methods: {},
  beforeRouteLeave(to, from, next) {
     // 设置下一个路由的 meta
    to.meta.keepAlive = true; // 让 A 缓存,即不刷新
    next();
  }
};

在 C 组件里面设置 beforeRouteLeave:

export default {
  data() {
    return {};
  },
  methods: {},
  beforeRouteLeave(to, from, next) {
    // 设置下一个路由的 meta
    to.meta.keepAlive = false; // 让 A 不缓存,即刷新
    next();
  }
};

这样便能实现 B 回到 A,A 不刷新;而 C 回到 A 则刷新。

总结

路由大法不错,不需要关心哪个页面跳转过来的,只要 router.go(-1) 就能回去,不需要额外参数。

然而在非单页应用的时候,keep-alive 并不能有效的缓存了= =

参考

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

Javascript 相关文章推荐
js checkbox(复选框) 使用集锦
Apr 28 Javascript
Jquery为单选框checkbox绑定单击click事件
Dec 18 Javascript
jQuery中 noConflict() 方法使用
Apr 25 Javascript
jQuery中parents()方法用法实例
Jan 07 Javascript
bootstrap表单按回车会自动刷新页面的解决办法
Mar 08 Javascript
老生常谈js-react组件生命周期
May 02 Javascript
JavaScript实现的原生态Tab标签页功能【兼容IE6】
Sep 18 Javascript
微信小程序页面跳转功能之从列表的item项跳转到下一个页面的方法
Nov 27 Javascript
JS实现把一个页面层数据传递到另一个页面的两种方式
Aug 13 Javascript
bootstrap datepicker的基本使用教程
Jul 09 Javascript
解决vue+ element ui 表单验证有值但验证失败问题
Jan 16 Javascript
ElementUI实现el-form表单重置功能按钮
Jul 21 Javascript
vue-router 导航钩子的具体使用方法
Aug 31 #Javascript
浅谈express 中间件机制及实现原理
Aug 31 #Javascript
JavaScript 通过Ajax 动态加载CheckBox复选框
Aug 31 #Javascript
BootStrap下的弹出框加载select2框架失败的解决方法
Aug 31 #Javascript
Angular2 http jsonp的实例详解
Aug 31 #Javascript
BootStrap中Table隐藏后显示问题的实现代码
Aug 31 #Javascript
Cpage.js给组件绑定事件的实现代码
Aug 31 #Javascript
You might like
php 智能404跳转代码,适合换域名没改变目录的网站
2010/06/04 PHP
PHP的引用详解
2015/02/22 PHP
PHP 进度条函数的简单实例
2017/09/19 PHP
javascript document.images实例
2008/05/27 Javascript
Ajax,UTF-8还是GB2312 eval 还是execScript
2008/11/13 Javascript
Javascript 静态页面实现随机显示广告的办法
2010/11/17 Javascript
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
Node.js 服务器端应用开发框架 -- Hapi.js
2014/07/29 Javascript
js正则表达式验证邮件地址
2015/11/12 Javascript
js性能优化技巧
2015/11/29 Javascript
Javascript中的Prototype到底是什么
2016/02/16 Javascript
Javascript之BOM(window对象)详解
2016/05/25 Javascript
Node.js测试中的Mock文件系统详解
2016/11/21 Javascript
Hexo已经看腻了,来手把手教你使用VuePress搭建个人博客
2018/04/26 Javascript
vue.js 添加 fastclick的支持方法
2018/08/28 Javascript
Javascript Worker子线程代码实例
2020/02/20 Javascript
JS实现简易图片自动轮播
2020/10/16 Javascript
vue+iview使用树形控件的具体使用
2020/11/02 Javascript
微信小程序实现点赞业务
2021/02/10 Javascript
Python yield 小结和实例
2014/04/25 Python
Python基于ThreadingTCPServer创建多线程代理的方法示例
2018/01/11 Python
python实现图片彩色转化为素描
2019/01/15 Python
matplotlib命令与格式之tick坐标轴日期格式(设置日期主副刻度)
2019/08/06 Python
Flask框架请求钩子与request请求对象用法实例分析
2019/11/07 Python
新年福利来一波之Python轻松集齐五福(demo)
2020/01/20 Python
pytorch 使用加载训练好的模型做inference
2020/02/20 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
2020/02/24 Python
Pytorch数据拼接与拆分操作实现图解
2020/04/30 Python
python 进程池pool使用详解
2020/10/15 Python
番木瓜健康和保健产品第一大制造商:Herbal Papaya
2017/04/25 全球购物
澳大利亚排名第一的狂热牛仔品牌:ONETEASPOON
2018/11/20 全球购物
英语专业毕业生自我鉴定
2013/11/09 职场文书
小学运动会前导词
2015/07/20 职场文书
大队委员竞选演讲稿
2015/11/20 职场文书
反四风问题学习心得体会
2016/01/22 职场文书
用Python远程登陆服务器的步骤
2021/04/16 Python