深入理解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现实多行信息
Aug 26 Javascript
制作高质量的JQuery Plugin 插件的方法
Apr 20 Javascript
jquery实现带二级菜单的导航示例
Apr 28 Javascript
js阻止事件追加的具体实现
Oct 15 Javascript
jQuery.extend 函数及用法详细
Sep 06 Javascript
表单验证插件Validation应用的实例讲解
Oct 10 Javascript
jquery form表单获取内容以及绑定数据
Feb 24 Javascript
javascript 中关于array的常用方法详解
May 05 Javascript
JS运动特效之同时运动实现方法分析
Jan 24 Javascript
利用js将ajax获取到的后台数据动态加载至网页中的方法
Aug 08 Javascript
react koa rematch 如何打造一套服务端渲染架子
Jun 26 Javascript
JavaScript实现公告栏上下滚动效果
Mar 13 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
咖啡的植物学知识
2021/03/03 咖啡文化
Codeigniter上传图片出现“You did not select a file to upload”错误解决办法
2014/06/12 PHP
详解PHP中的mb_detect_encoding函数使用方法
2015/08/18 PHP
浅谈使用 Yii2 AssetBundle 中 $publishOptions 的正确姿势
2017/11/08 PHP
微信JSSDK分享功能图文实例详解
2019/04/08 PHP
javascript编程起步(第七课)
2007/02/27 Javascript
JQuery 学习笔记 选择器之一
2009/07/23 Javascript
Jquery 常用方法经典总结
2010/01/28 Javascript
js判断样式className同时增加class或删除class
2013/01/30 Javascript
jquery ui对话框实例代码
2013/05/10 Javascript
自己编写的支持Ajax验证的JS表单验证插件
2015/05/15 Javascript
基于jQuery 实现bootstrapValidator下的全局验证
2015/12/07 Javascript
jQuery插件ajaxfileupload.js实现上传文件
2020/10/23 Javascript
Bootstrap实现带动画过渡的弹出框
2016/08/09 Javascript
js自定义弹框插件的封装
2020/08/24 Javascript
详解使用React制作一个模态框
2019/03/14 Javascript
[01:16]2014DOTA2 TI专访C9战队EE:中国五强中会占三席
2014/07/10 DOTA
Python的__builtin__模块中的一些要点知识
2015/05/02 Python
Python实现的文本简单可逆加密算法示例
2017/05/18 Python
python类的方法属性与方法属性的动态绑定代码详解
2017/12/27 Python
详解如何用python实现一个简单下载器的服务端和客户端
2019/10/28 Python
有原因的手表:Flex Watches
2019/03/23 全球购物
德国高尔夫商店:Golfshop.de
2019/06/22 全球购物
自我鉴定注意事项
2014/01/19 职场文书
学党史心得体会
2014/09/05 职场文书
银行会计主管岗位职责
2014/10/01 职场文书
防灾减灾宣传标语
2014/10/07 职场文书
2015年民兵整组工作总结
2015/07/24 职场文书
谢师宴家长答谢词
2015/09/30 职场文书
丧事酒宴答谢词
2015/09/30 职场文书
早上好问候语大全
2015/11/10 职场文书
企业廉洁教育心得体会
2016/01/20 职场文书
社区志愿者服务心得体会
2016/01/22 职场文书
JavaWeb 入门篇(3)ServletContext 详解 具体应用
2021/07/16 Java/Android
vue配置型表格基于el-table拓展之table-plus组件
2022/04/12 Vue.js
Nginx报错104:Connection reset by peer问题的解决及分析
2022/07/23 Servers