深入理解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 相关文章推荐
巧妙破除网页右键禁用的十大绝招
Aug 12 Javascript
js 刷新页面的代码小结 推荐
Apr 02 Javascript
11款新鲜的jQuery插件[附所有demo下载]
Jan 24 Javascript
用js的for循环获取radio选中的值
Oct 21 Javascript
Jquery中offset()和position()的区别分析
Feb 05 Javascript
JavaScript tab选项卡插件实例代码
Feb 23 Javascript
JS基于面向对象实现的选项卡效果示例
Dec 20 Javascript
javascript数据类型详解
Feb 07 Javascript
jQuery动态移除和添加背景图片的方法详解
Mar 07 Javascript
VueJs组件prop验证简单介绍
Sep 12 Javascript
Echarts地图添加引导线效果(labelLine)
Sep 30 Javascript
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
Jan 08 Vue.js
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入门之连接mysql数据库的一个类
2012/04/21 PHP
PHP自动生成后台导航网址的最佳方法
2013/08/27 PHP
php环境下利用session防止页面重复刷新的具体实现
2014/01/09 PHP
phpmyadmin打开很慢的解决方法
2014/04/21 PHP
PHP 5.3新增魔术方法__invoke概述
2014/07/23 PHP
Yii2创建表单(ActiveForm)方法详解
2016/07/23 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
2016/11/15 PHP
KindEditor在php环境下上传图片功能集成的方法示例
2020/07/20 PHP
js封装的textarea操作方法集合(兼容很好)
2010/11/16 Javascript
JavaScript中访问节点对象的方法有哪些如何使用
2013/09/24 Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
2013/12/05 Javascript
如何书写高质量jQuery代码(使用jquery性能问题)
2014/06/30 Javascript
js实现点击后将文字或图片复制到剪贴板的方法
2014/08/04 Javascript
Javascript中setTimeOut和setInterval的定时器用法
2015/06/12 Javascript
javascript判断图片是否加载完成的方法推荐
2016/05/13 Javascript
DOM 事件的深入浅出(二)
2016/12/05 Javascript
使用原生js封装的ajax实例(兼容jsonp)
2017/10/12 Javascript
javascript代码优化的8点总结
2018/01/29 Javascript
vue项目中使用tinymce编辑器的步骤详解
2018/09/11 Javascript
vue页面切换过渡transition效果
2018/10/08 Javascript
layui 图片上传+表单提交+ Spring MVC的实例
2019/09/21 Javascript
Python基础篇之初识Python必看攻略
2016/06/23 Python
对Python3中列表乘以某一个数的示例详解
2019/07/20 Python
通过实例简单了解Python中yield的作用
2019/12/11 Python
Python集成开发工具Pycharm的安装和使用详解
2020/03/18 Python
CSS3教程(5):网页背景图片
2009/04/02 HTML / CSS
英国最大的高品质珠宝和手表专家:Goldsmiths
2017/03/11 全球购物
自主招生自荐信格式
2013/12/03 职场文书
质检部部长职责
2013/12/16 职场文书
高中毕业自我鉴定
2013/12/22 职场文书
小学教师师德反思
2014/02/03 职场文书
乡镇组织委员个人整改措施
2014/09/16 职场文书
公司庆典欢迎词
2015/01/26 职场文书
请客吃饭开场白
2015/06/01 职场文书
Python基础之pandas数据合并
2021/04/27 Python
BCL经典机 SONY ICF-5900W电路分析
2022/04/24 无线电