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 相关文章推荐
用客户端js实现带省略号的分页
Apr 27 Javascript
JavaScript中为什么null==0为false而null大于=0为true(个人研究)
Sep 16 Javascript
javascript实现存储hmtl字符串示例
Apr 25 Javascript
Node.js配合node-http-proxy解决本地开发ajax跨域问题
Aug 31 Javascript
js querySelector() 使用方法
Dec 21 Javascript
Angular directive递归实现目录树结构代码实例
May 05 Javascript
vue.js的computed,filter,get,set的用法及区别详解
Mar 08 Javascript
Vue.js组件高级特性实例详解
Dec 24 Javascript
jQuery中each和js中forEach的区别分析
Feb 27 jQuery
小程序分页实践之编写可复用分页组件
Jul 18 Javascript
Vue 修改网站图标的方法
Dec 31 Vue.js
vue集成一个支持图片缩放拖拽的富文本编辑器
Jan 29 Vue.js
深入理解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
PHP自动生成月历代码
2006/10/09 PHP
PHP初学者头疼问题总结
2006/10/09 PHP
PHP新手入门学习方法
2011/05/08 PHP
php递归创建和删除文件夹的代码小结
2012/04/13 PHP
解决file_get_contents无法请求https连接的方法
2013/12/17 PHP
yii分页组件用法实例分析
2015/12/28 PHP
PHP编程之设置apache虚拟目录
2016/07/08 PHP
浅谈php中fopen不能创建中文文件名文件的问题
2017/02/06 PHP
php中钩子(hook)的原理与简单应用demo示例
2019/09/03 PHP
鼠标图片振动代码
2006/07/06 Javascript
location.href 在IE6中不跳转的解决方法与推荐使用代码
2010/07/08 Javascript
node.js中的fs.symlinkSync方法使用说明
2014/12/15 Javascript
浅谈javascript中replace()方法
2015/11/10 Javascript
jQuery模仿阿里云购买服务器选择购买时间长度的代码
2016/04/29 Javascript
Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法
2016/06/23 Javascript
JS拉起或下载app的实现代码
2017/02/22 Javascript
详解AngularJS1.x学习directive 中‘&amp; ’‘=’ ‘@’符号的区别使用
2017/08/23 Javascript
Vue实现数据表格合并列rowspan效果
2020/11/30 Javascript
详解uniapp的全局变量实现方式
2021/01/11 Javascript
NodeJS和浏览器中this关键字的不同之处
2021/03/03 NodeJs
[11:01]2014DOTA2西雅图邀请赛 冷冷带你探秘威斯汀
2014/07/08 DOTA
在Python的Django框架中获取单个对象数据的简单方法
2015/07/17 Python
基于python 处理中文路径的终极解决方法
2018/04/12 Python
python简单操作excle的方法
2018/09/12 Python
python读出当前时间精度到秒的代码
2019/07/05 Python
Python:合并两个numpy矩阵的实现
2019/12/02 Python
Python利用for循环打印星号三角形的案例
2020/04/12 Python
快递业务员岗位职责
2014/01/06 职场文书
打架检讨书100字
2014/01/19 职场文书
《影子》教学反思
2014/02/21 职场文书
学习党的群众路线实践活动思想汇报
2014/09/12 职场文书
四风查摆问题及整改措施
2014/10/10 职场文书
2014旅游局党组书记党建工作汇报材料
2014/11/02 职场文书
2014最新股权信托合同协议书
2014/11/18 职场文书
2015企业年终工作总结范文
2015/05/27 职场文书
机关单位2016年创先争优活动总结
2016/04/05 职场文书