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 相关文章推荐
jQuery 加上最后自己的验证
Nov 04 Javascript
一个简单的js渐显(fadeIn)渐隐(fadeOut)类
Jun 19 Javascript
JS基础之undefined与null的区别分析
Aug 08 Javascript
js将long日期格式转换为标准日期格式实现思路
Apr 07 Javascript
获取内联和链接中的样式(js代码)
Apr 11 Javascript
使用CDN和AJAX加速WordPress中jQuery的加载
Dec 05 Javascript
JavaScript与jQuery实现的闪烁输入效果
Feb 18 Javascript
jquery $.trim()去除字符串空格的实现方法【附图例】
Mar 30 Javascript
AngularJS ng-style中使用filter
Sep 21 Javascript
预防网页挂马的方法总结
Nov 03 Javascript
Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址
May 21 Javascript
vue输入框使用模糊搜索功能的实现代码
May 26 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
ThinkPHP之N方法实例详解
2014/06/20 PHP
php数组索引的Key加引号和不加引号的区别
2014/08/19 PHP
游戏人文件夹程序 ver 4.03
2006/07/14 Javascript
用js实现预览待上传的本地图片
2007/03/15 Javascript
js为鼠标添加右击事件防止默认的右击菜单弹出
2013/07/29 Javascript
jquery的ajax异步请求接收返回json数据实例
2014/06/16 Javascript
jQuery+html5实现div弹出层并遮罩背景
2015/04/15 Javascript
js+HTML5基于过滤器从摄像头中捕获视频的方法
2015/06/16 Javascript
基于javascript制作经典传统的拼图游戏
2016/03/22 Javascript
ichart.js绘制虚线、平均分虚线效果的实现代码
2016/05/05 Javascript
JSON字符串和对象相互转换实例分析
2016/06/16 Javascript
jQuery实现一个简单的轮播图
2017/02/19 Javascript
AngularJS ionic手势事件的使用总结
2017/08/09 Javascript
跟混乱的页面弹窗说再见
2019/04/11 Javascript
使用原生javascript开发计算器实例代码
2021/02/21 Javascript
python中assert用法实例分析
2015/04/30 Python
TensorFlow数据输入的方法示例
2018/06/19 Python
Python的iOS自动化打包实例代码
2018/11/22 Python
对Xpath 获取子标签下所有文本的方法详解
2019/01/02 Python
python实现海螺图片的方法示例
2019/05/12 Python
selenium获取当前页面的url、源码、title的方法
2019/06/12 Python
Python IDLE或shell中切换路径的操作
2020/03/09 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
2020/05/26 Python
python文件及目录操作代码汇总
2020/07/08 Python
详解BeautifulSoup获取特定标签下内容的方法
2020/12/07 Python
Html5内唤醒百度、高德APP的实现示例
2019/05/20 HTML / CSS
HTML4和HTML5之间除了相似以外的10个主要不同
2012/12/13 HTML / CSS
使用HTML5的Canvas绘制曲线的简单方法
2015/09/08 HTML / CSS
美国儿童运动鞋和服装零售商:Kids Foot Locker
2017/08/05 全球购物
Joseph官网:英国小众奢侈品牌
2019/05/17 全球购物
资深财务管理人员自我评价
2013/09/22 职场文书
教师岗位职责
2013/11/17 职场文书
高中军训感言800字
2014/03/05 职场文书
婚假请假条格式及范文
2014/04/10 职场文书
MySQL Router实现MySQL的读写分离的方法
2021/05/27 MySQL
SpringBoot 集成Redis 过程
2021/06/02 Redis