深入理解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 相关文章推荐
Javascript hasOwnProperty 方法 &amp; in 关键字
Nov 26 Javascript
CSS JavaScript 实现菜单功能 改进版
Dec 09 Javascript
浅析javascript闭包 实例分析
Dec 25 Javascript
判断是否安装flash player及当前版本的JS代码
Aug 08 Javascript
JS表单验证的代码(常用)
Apr 08 Javascript
使用yeoman构建angular应用的方法
Aug 14 Javascript
jQuery实现手势解锁密码特效
Aug 14 jQuery
jQuery实现手机号正则验证输入及自动填充空格功能
Jan 02 jQuery
完美解决axios在ie下的兼容性问题
Mar 05 Javascript
详解ES6中的三种异步解决方案
Jun 28 Javascript
AngularJS $http post 传递参数数据的方法
Oct 09 Javascript
关于layui表单中按钮自动提交的解决方法
Sep 09 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+javascript模拟Matrix画面
2006/10/09 PHP
PHP has encountered an Access Violation at 7C94BD02解决方法
2009/08/24 PHP
php中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
php教程 插件机制在PHP中实现方案
2012/11/02 PHP
部署PHP项目应该注意的几点事项分享
2013/12/20 PHP
Codeigniter发送邮件的方法
2015/03/19 PHP
PHP面试题之文件目录操作
2015/10/15 PHP
php微信开发之上传临时素材
2016/06/24 PHP
laravel中的错误与日志用法详解
2016/07/26 PHP
PHP观察者模式实例分析【对比JS观察者模式】
2019/05/22 PHP
解决Laravel 使用insert插入数据,字段created_at为0000的问题
2019/10/11 PHP
疯掉了,尽然有js写的操作系统
2007/04/23 Javascript
Javascript的常规数组和关联数组对比小结
2012/05/24 Javascript
调用DOM对象的focus使文本框获得焦点
2014/02/19 Javascript
jQuery实现延迟跳转的方法
2015/06/05 Javascript
Bootstrap按钮下拉菜单组件详解
2016/05/10 Javascript
jQuery Validate 数组 全部验证问题
2017/01/12 Javascript
微信小程序实现登录页云层漂浮的动画效果
2017/05/05 Javascript
详解Vue.js组件可复用性的混合(mixin)方式和自定义指令
2017/09/06 Javascript
VUE在for循环里面根据内容值动态的加入class值的方法
2018/08/12 Javascript
JsonProperty 的使用方法详解
2019/10/11 Javascript
JavaScript中的函数申明、函数表达式、箭头函数
2019/12/06 Javascript
JS造成内存泄漏的几种情况实例分析
2020/03/02 Javascript
小程序表单认证布局及验证详解
2020/06/19 Javascript
Python使用剪切板的方法
2017/06/06 Python
python实现单链表中删除倒数第K个节点的方法
2018/09/28 Python
python 图像处理画一个正弦函数代码实例
2019/09/10 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
2020/02/17 Python
python列表删除和多重循环退出原理详解
2020/03/26 Python
python爬虫筛选工作实例讲解
2020/11/23 Python
自我鉴定写作要点
2014/01/17 职场文书
小学语文教学反思
2014/02/10 职场文书
六一儿童节开幕词
2015/01/29 职场文书
配置nginx 重定向到系统维护页面
2021/06/08 Servers
php修改word的实例方法
2021/11/17 PHP
【DOTA2】高能暴走TK秀!PSG LGD vs ASTER - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA