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 相关文章推荐
如何实现动态删除javascript函数
May 27 Javascript
JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
Aug 12 Javascript
Node.js中child_process实现多进程
Feb 03 Javascript
IE及IE6浏览器中判断JS文件加载成功失败的方法
Feb 18 Javascript
使用AngularJS来实现HTML页面嵌套的方法
Jun 17 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
Jun 08 Javascript
node.js文件上传处理示例
Oct 27 Javascript
基于vue实现多引擎搜索及关键字提示
Mar 16 Javascript
AngularJs用户输入动态模板XSS攻击示例详解
Apr 21 Javascript
Angular5中提取公共组件之radio list的实例代码
Jul 10 Javascript
vue + element-ui的分页问题实现
Dec 17 Javascript
JS判断浏览器类型与操作系统的方法分析
Apr 30 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
php 高性能书写
2010/12/11 PHP
php命令行使用方法和命令行参数说明
2014/04/08 PHP
详解PHP文件的自动加载(autoloading)
2018/02/04 PHP
PHP一致性hash分布式算法封装类定义与用法示例
2018/08/04 PHP
php判断某个方法是否存在函数function_exists (),method_exists()与is_callable()区别与用法解析
2020/04/20 PHP
Ajax搜索结果页面下方的分页按钮的生成
2012/04/05 Javascript
js数组的基本用法及数组根据下标(数值或字符)移除元素
2013/10/20 Javascript
jquery中html、val与text三者属性取值的联系与区别介绍
2013/12/29 Javascript
JavaScript中用于生成随机数的Math.random()方法
2015/06/15 Javascript
jquery使用ul模拟select实现表单美化的方法
2015/08/18 Javascript
jquery图片倾斜层叠切换特效代码分享
2015/08/27 Javascript
js识别uc浏览器的代码
2015/11/06 Javascript
js实现跨域的多种方法
2015/12/25 Javascript
基于javascript实现checkbox复选框实例代码
2016/01/28 Javascript
js实现旋转木马效果
2017/03/17 Javascript
微信小程序开发之map地图实现教程
2017/06/08 Javascript
在HTML文档中嵌入JavaScript的四种方法
2018/05/07 Javascript
微信小程序实现自上而下字幕滚动
2018/07/14 Javascript
浅谈layer弹出层按钮颜色修改方法
2019/09/11 Javascript
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
2019/11/07 jQuery
python操作xml文件示例
2014/04/07 Python
python itchat实现微信自动回复的示例代码
2017/08/14 Python
python导入pandas具体步骤方法
2019/06/23 Python
python实现在cmd窗口显示彩色文字
2019/06/24 Python
python对象转字典的两种实现方式示例
2019/11/07 Python
一款恶搞头像特效的制作过程 利用css3和jquery
2014/11/21 HTML / CSS
深入浅析HTML5中的SVG
2015/11/27 HTML / CSS
创业计划书的内容步骤和要领
2014/01/04 职场文书
文秘个人求职信范文
2014/04/22 职场文书
村干部四风问题整改措施
2014/09/30 职场文书
2014年个人师德工作总结
2014/12/04 职场文书
高三语文复习计划
2015/01/19 职场文书
单位租车协议书
2015/01/29 职场文书
汶川大地震感悟
2015/08/10 职场文书
启迪人心的励志语录:脾气永远不要大于本事
2020/01/02 职场文书
Nginx反向代理及负载均衡如何实现(基于linux)
2021/03/31 Servers