深入理解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 相关文章推荐
jQuery的实现原理的模拟代码 -2 数据部分
Aug 01 Javascript
麻雀虽小五脏俱全 Dojo自定义控件应用
Sep 04 Javascript
javascript学习笔记(十) js对象 继承
Jun 19 Javascript
JQ获取动态加载的图片大小的正确方法分享
Nov 08 Javascript
JavaScript类属性的访问方式详解
Feb 11 Javascript
jQuery实现的原图对比窗帘效果
Jun 15 Javascript
基于jQuery实现仿搜狐辩论投票动画代码(附源码下载)
Feb 18 Javascript
使用Ajax与服务器(JSON)通信实例
Nov 04 Javascript
微信小程序 地图(map)实例详解
Nov 16 Javascript
javascript入门之数组[新手必看]
Nov 21 Javascript
vue 实现element-ui中的加载中状态
Nov 11 Javascript
Vue全家桶入门基础教程
May 14 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
常用星际术语索引(新手指南)
2020/03/04 星际争霸
多文件上传的例子
2006/10/09 PHP
PHP简单系统查询模块代码打包下载
2008/06/07 PHP
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
2013/06/18 PHP
PHP中通过trigger_error触发PHP错误示例
2015/06/23 PHP
thinkphp5实现无限级分类
2019/02/18 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
2019/04/30 PHP
JavaScript下申明对象的几种方法小结
2008/10/02 Javascript
JavaScript 对象模型 执行模型
2010/10/15 Javascript
使用Jquery获取带特殊符号的ID 标签的方法
2014/04/30 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
2015/12/13 Javascript
详解javascript中原始数据类型Null和Undefined
2015/12/17 Javascript
jQuery常用的一些技巧汇总
2016/03/26 Javascript
JavaScript代码实现左右上下自动晃动自动移动
2016/04/08 Javascript
jQuery简单实现对数组去重及排序操作实例
2017/10/31 jQuery
JS实现的新闻列表自动滚动效果示例
2019/01/30 Javascript
Angular value与ngValue区别详解
2019/11/27 Javascript
Python 共享变量加锁、释放详解
2019/08/28 Python
Python中 CSV格式清洗与转换的实例代码
2019/08/29 Python
python对XML文件的操作实现代码
2020/03/27 Python
keras和tensorflow使用fit_generator 批次训练操作
2020/07/03 Python
Html5在手机端调用相机的方法实现
2020/05/13 HTML / CSS
我们是伦敦女孩:WalG
2018/01/08 全球购物
印度购买眼镜和太阳镜网站:Coolwinks
2018/09/26 全球购物
英国最大的在线蜡烛商店:Candles Direct
2019/03/26 全球购物
中海讯通笔试题
2015/09/15 面试题
幼师自我鉴定范文
2013/10/01 职场文书
企业厂务公开实施方案
2014/03/26 职场文书
会计专业求职信
2014/08/10 职场文书
党委书记群众路线对照检查材料思想汇报
2014/10/04 职场文书
2015年音乐教师个人工作总结
2015/05/20 职场文书
停发工资证明范本
2015/06/12 职场文书
交通事故责任认定书
2015/08/06 职场文书
《浅水洼里的小鱼》教学反思
2016/02/16 职场文书
个人销售励志奋斗口号
2019/12/05 职场文书
详解JavaScript中的执行上下文及调用堆栈
2021/04/29 Javascript