Vue keep-alive实践总结(推荐)


Posted in Javascript onAugust 31, 2017

<keep-alive>是Vue的内置组件,能在组件切换过程中将状态保留在内存中,防止重复渲染DOM。

<keep-alive> 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。和 <transition> 相似,<keep-alive> 是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在父组件链中。

prop:

  • include: 字符串或正则表达式。只有匹配的组件会被缓存。
  • exclude: 字符串或正则表达式。任何匹配的组件都不会被缓存。

在2.1.0版本Vue中

常见用法:

// 组件
export default {
 name: 'test-keep-alive',
 data () {
 return {
  includedComponents: "test-keep-alive"
 }
 }
}
<keep-alive include="test-keep-alive">
 <!-- 将缓存name为test-keep-alive的组件 -->
 <component></component>
</keep-alive>

<keep-alive include="a,b">
 <!-- 将缓存name为a或者b的组件,结合动态组件使用 -->
 <component :is="view"></component>
</keep-alive>

<!-- 使用正则表达式,需使用v-bind -->
<keep-alive :include="/a|b/">
 <component :is="view"></component>
</keep-alive>

<!-- 动态判断 -->
<keep-alive :include="includedComponents">
 <router-view></router-view>
</keep-alive>

<keep-alive exclude="test-keep-alive">
 <!-- 将不缓存name为test-keep-alive的组件 -->
 <component></component>
</keep-alive>

结合router,缓存部分页面

使用$route.meta的keepAlive属性:

<keep-alive>
 <router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"></router-view>

需要在router中设置router的元信息meta:

//...router.js
export default new Router({
 routes: [
 {
  path: '/',
  name: 'Hello',
  component: Hello,
  meta: {
  keepAlive: false // 不需要缓存
  }
 },
 {
  path: '/page1',
  name: 'Page1',
  component: Page1,
  meta: {
  keepAlive: true // 需要被缓存
  }
 }
 ]
})

使用效果

以上面router的代码为例:

<!-- Page1页面 -->
<template>
 <div class="hello">
 <h1>Vue</h1>
 <h2>{{msg}}</h2>
 <input placeholder="输入框"></input>
 </div>
</template>

<!-- Hello页面 -->
<template>
 <div class="hello">
 <h1>{{msg}}</h1>
 </div>
</template>

(1) 在Page1页面输入框输入“asd”,然后手动跳转到Hello页面;

(2) 回到Page1页面发现之前输入的"asd"依然保留,说明页面信息成功保存在内存中;

Vue keep-alive实践总结(推荐)

​ 图1 进入Page1页面,并输入"asd"

Vue keep-alive实践总结(推荐)

​ 图2 跳转到Hello

Vue keep-alive实践总结(推荐)

​ 图3 返回Page1页面,输入框数据会被保留

当然,也可以通过动态设置route.meta的keepAlive属性来实现其他需求,

借鉴一下vue-router 之 keep-alive这篇博客中的例子:

  • 首页是A页面
  • B页面跳转到A,A页面需要缓存
  • C页面跳转到A,A页面不需要被缓存

思路是在每个路由的beforeRouteLeave(to, from, next)钩子中设置to.meta.keepAlive

A的路由:

{
 path: '/',
 name: 'A',
 component: A,
 meta: {
  keepAlive: true // 需要被缓存
 }
}
export default {
 data() {
  return {};
 },
 methods: {},
 beforeRouteLeave(to, from, next) {
   // 设置下一个路由的 meta
  to.meta.keepAlive = true; // B 跳转到 A 时,让 A 缓存,即不刷新
  next();
 }
};
export default {
 data() {
  return {};
 },
 methods: {},
 beforeRouteLeave(to, from, next) {
  // 设置下一个路由的 meta
  to.meta.keepAlive = false; // C 跳转到 A 时让 A 不缓存,即刷新
  next();
 }
};

亲测有效哦~

keep-alive生命周期钩子函数:activated、deactivated

使用<keep-alive>会将数据保留在内存中,如果要在每次进入页面的时候获取最新的数据,需要在activated阶段获取数据,承担原来created钩子中获取数据的任务。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
使用GruntJS链接与压缩多个JavaScript文件过程详解
Aug 02 Javascript
关于javascript event flow 的一个bug详解
Sep 17 Javascript
js+CSS实现模拟华丽的select控件下拉菜单效果
Sep 01 Javascript
有关json_decode乱码及NULL的问题
Oct 13 Javascript
jQuery头像裁剪工具jcrop用法实例(附演示与demo源码下载)
Jan 22 Javascript
jquery实现列表上下移动功能
Feb 25 Javascript
JS组件Bootstrap Select2使用方法解析
May 30 Javascript
JS实现数字格式千分位相互转换方法
Aug 01 Javascript
codeMirror插件使用讲解
Jan 16 Javascript
详解webpack进阶之插件篇
Jul 06 Javascript
vue的路由映射问题及解决方案
Oct 14 Javascript
一起深入理解js中的事件对象
Feb 06 Javascript
深入理解vue-router之keep-alive
Aug 31 #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
You might like
phpMyAdmin下载、安装和使用入门教程
2007/05/31 PHP
php读取二进制流(C语言结构体struct数据文件)的深入解析
2013/06/13 PHP
php+mysql实现用户注册登陆的方法
2015/01/03 PHP
支付宝支付开发――当面付条码支付和扫码支付实例
2016/11/04 PHP
php图片合成方法(多张图片合成一张)
2017/11/25 PHP
快速解决PHP调用Word组件DCOM权限的问题
2017/12/27 PHP
PHP将整数数字转换为罗马数字实例分享
2019/03/17 PHP
jquery datatable后台封装数据示例代码
2014/08/07 Javascript
详解Bootstrap的aria-label和aria-labelledby应用
2016/01/04 Javascript
javascript简单判断输入内容是否合法的方法
2016/05/11 Javascript
javascript中使用未定义变量或值的情况分析
2016/07/19 Javascript
jQuery实现的放大镜效果示例
2016/09/13 Javascript
JavaScript学习笔记整理_setTimeout的应用
2016/09/19 Javascript
完美解决node.js中使用https请求报CERT_UNTRUSTED的问题
2017/01/08 Javascript
原生js实现弹出层效果
2017/01/20 Javascript
前端主流框架vue学习笔记第二篇
2017/07/26 Javascript
说说AngularJS中的$parse和$eval的用法
2017/09/14 Javascript
CheckBox多选取值及判断CheckBox选中是否为空的实例
2017/10/31 Javascript
VUE重点问题总结
2018/03/19 Javascript
Vue源码探究之虚拟节点的实现
2019/04/17 Javascript
Async/Await替代Promise的6个理由
2019/06/15 Javascript
JS错误处理与调试操作实例分析
2020/04/13 Javascript
[01:58]最残酷竞争 2016国际邀请赛中国区预选赛积分循环赛回顾
2016/06/28 DOTA
pygame学习笔记(4):声音控制
2015/04/15 Python
Python实现将SQLite中的数据直接输出为CVS的方法示例
2017/07/13 Python
python xpath获取页面注释的方法
2019/01/14 Python
python算法题 链表反转详解
2019/07/02 Python
python 实现线程之间的通信示例
2020/02/14 Python
HTML5 Canvas中绘制椭圆的4种方法
2015/04/24 HTML / CSS
外国语学院毕业生自荐信
2013/10/28 职场文书
毕业生优秀推荐信
2013/11/26 职场文书
社区领导班子四风问题原因分析及整改措施
2014/09/28 职场文书
2014年行风建设工作总结
2014/12/01 职场文书
赢在执行观后感
2015/06/16 职场文书
2016年春季运动会广播稿
2015/08/19 职场文书
详解JVM系列之内存模型
2021/06/10 Javascript