深入理解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 刷新全集常用代码
Nov 22 Javascript
javascript中this做事件参数相关问题解答
Mar 17 Javascript
jquery实现鼠标拖动图片效果示例代码
Jan 09 Javascript
javascript 判断页面访问方式电脑或者移动端
Sep 19 Javascript
AngularJS自定义控件实例详解
Dec 13 Javascript
jquery实现焦点轮播效果
Feb 23 Javascript
JavaScript中三种常见的排序方法
Feb 24 Javascript
ES6生成器用法实例分析
Apr 10 Javascript
浅谈Node.js爬虫之网页请求模块
Jan 11 Javascript
浅谈Vue.use的使用
Aug 29 Javascript
vue3.0 CLI - 2.1 -  component 组件入门教程
Sep 14 Javascript
详解vue-router 动态路由下子页面多页共活的解决方案
Dec 22 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
深入PHP5中的魔术方法详解
2013/06/17 PHP
PHP 读取和编写 XML
2014/11/19 PHP
php生成zip文件类实例
2015/04/07 PHP
thinkphp中的多表关联查询的实例详解
2017/10/12 PHP
javascript 原型模式实现OOP的再研究
2009/04/09 Javascript
jQuery Tools Dateinput使用介绍
2012/07/14 Javascript
js识别不同浏览器基于userAgent做判断
2014/07/29 Javascript
使用Chrome调试JavaScript的断点设置和调试技巧
2014/12/16 Javascript
2014 年最热门的21款JavaScript框架推荐
2014/12/25 Javascript
Javascript无参数和有参数类继承问题解决方法
2015/03/02 Javascript
AngularJS 使用$sce控制代码安全检查
2016/01/05 Javascript
jQuery控制frames及frame页面JS的方法
2016/03/08 Javascript
在 React、Vue项目中使用SVG的方法
2018/02/09 Javascript
基于node+vue实现简单的WebSocket聊天功能
2020/02/01 Javascript
vue在图片上传的时候压缩图片
2020/11/18 Vue.js
express异步函数异常捕获示例详解
2020/11/30 Javascript
JS操作JSON常用方法(10w阅读)
2020/12/06 Javascript
vue项目中openlayers绘制行政区划
2020/12/24 Vue.js
[03:40]DOTA2英雄梦之声_第01期_炼金术士
2014/06/23 DOTA
[05:49]2014DOTA2TI4正赛第二日综述 昔日冠军纷纷落马 VG LGD占尽先机
2014/07/20 DOTA
跟老齐学Python之有容乃大的list(3)
2014/09/15 Python
Python数据结构之Array用法实例
2014/10/09 Python
Django RBAC权限管理设计过程详解
2019/08/06 Python
python实现智能语音天气预报
2019/12/02 Python
美国药妆网站:EDCskincare.com(防晒、痤疮、抗衰老等)
2017/04/28 全球购物
戴尔英国翻新电脑和电子产品:Dell UK Refurbished Computers
2019/07/30 全球购物
瑞典耳机品牌:URBANISTA
2019/12/03 全球购物
招商经理岗位职责
2013/11/16 职场文书
美国探亲签证邀请信
2014/02/05 职场文书
军训鉴定表自我鉴定
2014/02/13 职场文书
医院党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
入党积极分子半年考察意见
2015/06/02 职场文书
2016大学生国家助学贷款承诺书
2016/03/25 职场文书
python实现简易名片管理系统
2021/04/11 Python
python实现过滤敏感词
2021/05/08 Python
python字典进行运算原理及实例分享
2021/08/02 Python