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 相关文章推荐
用YUI做了个标签浏览效果
Feb 20 Javascript
javascript中的作用域scope介绍
Dec 28 Javascript
js判读浏览器是否支持html5的canvas的代码
Nov 18 Javascript
理解javascript中的回调函数(callback)
Sep 02 Javascript
Web开发必知Javascript技巧大全
Feb 23 Javascript
微信小程序实现顶部选项卡(swiper)
Jun 19 Javascript
vue生成token保存在客户端localStorage中的方法
Oct 25 Javascript
微信小程序图片轮播组件gallery slider使用方法详解
Jan 31 Javascript
解析vue路由异步组件和懒加载案例
Jun 08 Javascript
详解vue项目打包步骤
Mar 29 Javascript
jQuery HTML设置内容和属性操作实例分析
May 20 jQuery
react中hook介绍以及使用教程
Dec 11 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
微信公众号开发之微信公共平台消息回复类实例
2014/11/14 PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
2014/11/25 PHP
PHP Cookei记录用户历史浏览信息的代码
2016/02/03 PHP
thinkPHP实现基于ajax的评论回复功能
2018/06/22 PHP
PHP连接MySQL数据库操作代码实例解析
2020/07/11 PHP
php的单例模式及应用场景详解
2021/02/27 PHP
jQuery入门知识简介
2010/03/04 Javascript
jQuery模拟点击A标记示例参考
2014/04/17 Javascript
jquery获取对象的方法足以应付常见的各种类型的对象
2014/05/14 Javascript
js创建一个input数组并绑定click事件的方法
2014/06/12 Javascript
JavaScript中的Promise使用详解
2015/06/24 Javascript
javascript实现不同颜色Tab标签切换效果
2016/04/27 Javascript
Backbone中View之间传值的学习心得
2016/08/09 Javascript
vue.js指令v-model使用方法
2017/03/20 Javascript
AngularJS自定义指令详解(有分页插件代码)
2017/06/12 Javascript
详解VSCode配置启动Vue项目
2019/05/14 Javascript
AngularJS实现的鼠标拖动画矩形框示例【可兼容IE8】
2019/05/17 Javascript
vue基于v-charts封装双向条形图的实现代码
2019/12/09 Javascript
vue下拉刷新组件的开发及slot的使用详解
2020/12/23 Vue.js
Python中音频处理库pydub的使用教程
2017/06/07 Python
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
2018/01/20 Python
django文档学习之applications使用详解
2018/01/29 Python
Python 元类实例解析
2018/04/04 Python
Python中的Numpy矩阵操作
2018/08/12 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
2018/09/03 Python
python与C、C++混编的四种方式(小结)
2019/07/15 Python
Python实现CNN的多通道输入实例
2020/01/17 Python
庆元旦迎新年广播稿
2014/02/18 职场文书
《云雀的心愿》教学反思
2014/02/25 职场文书
应用数学专业求职信
2014/03/14 职场文书
2014年小学少先队工作总结
2014/12/18 职场文书
分析MySQL抛出异常的几种常见解决方式
2021/05/18 MySQL
解决pytorch读取自制数据集出现过的问题
2021/05/31 Python
教你做个可爱的css滑动导航条
2021/06/15 HTML / CSS
Python下载商品数据并连接数据库且保存数据
2022/03/31 Python
CSS使用SVG实现动态分布的圆环发散路径动画
2022/12/24 HTML / CSS