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

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

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

一、prop:

  • include: 字符串或正则表达式。只有匹配的组件会被缓存。
  • exclude: 字符串或正则表达式。任何匹配的组件都不会被缓存。
  1. // 组件
  2. export default {
  3. name: 'test-keep-alive',
  4. data () {
  5. return {
  6. includedComponents: "test-keep-alive"
  7. }
  8. }
  9. }
  1. <keep-alive include="test-keep-alive">
  2. <!-- 将缓存name为test-keep-alive的组件 -->
  3. <component></component>
  4. </keep-alive>
  5.  
  6. <keep-alive include="a,b">
  7. <!-- 将缓存name为a或者b的组件,结合动态组件使用 -->
  8. <component :is="view"></component>
  9. </keep-alive>
  10.  
  11. <!-- 使用正则表达式,需使用v-bind -->
  12. <keep-alive :include="/a|b/">
  13. <component :is="view"></component>
  14. </keep-alive>
  15.  
  16. <!-- 动态判断 -->
  17. <keep-alive :include="includedComponents">
  18. <router-view></router-view>
  19. </keep-alive>
  20.  
  21. <keep-alive exclude="test-keep-alive">
  22. <!-- 将不缓存name为test-keep-alive的组件 -->
  23. <component></component>
  24. </keep-alive>

二、结合router,缓存部分页面

使用$route.meta的keepAlive属性:

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

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

  1. //...router.js
  2. export default new Router({
  3. routes: [
  4. {
  5. path: '/',
  6. name: 'Hello',
  7. component: Hello,
  8. meta: {
  9. keepAlive: false // 不需要缓存
  10. }
  11. },
  12. {
  13. path: '/page1',
  14. name: 'Page1',
  15. component: Page1,
  16. meta: {
  17. keepAlive: true // 需要被缓存
  18. }
  19. }
  20. ]
  21. })

三、使用效果展示

以上面router的代码为例:

  1. <!-- Page1页面 -->
  2. <template>
  3. <div class="hello">
  4. <h1>Vue</h1>
  5. <h2>{{msg}}</h2>
  6. <input placeholder="输入框"></input>
  7. </div>
  8. </template>
  1. <!-- Hello页面 -->
  2. <template>
  3. <div class="hello">
  4. <h1>{{msg}}</h1>
  5. </div>
  6. </template>

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

(2)跳转到Hello页面


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

 四、以下问题的解决:

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

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

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

[Vue]Vue keep-alive的更多相关文章

  1. Javascript - Vue - vue对象

    vue提供了一整套前端解决方案,可以提升企业开发效率 vue的处理过程 app.js 项目入口,所有请求最先进入此模块进行处理 route.js 由app.js调用,处理路由的分发 controlle ...

  2. Vue - vue.js 常用指令

    Vue - vue.js 常用指令 目录: 一. vuejs模板语法之常用指令 1. 常用指令: v-html 2. 常用指令: v-text 3. 常用指令: v-for 4. 常用指令: v-if ...

  3. 前端开发 Vue Vue.js和Nodejs的关系

    首先vue.js 是库,不是框架,不是框架,不是框架. Vue.js 使用了基于 HTML 的模版语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据. Vue.js 的核心是一个允许你 ...

  4. [Vue] : Vue概述

    什么是Vue.js Vue.js 是目前最火的一个前端框架,React是最流行的一个前端框架. Vue.js 是前端的主流框架之一,和Angular.js.React.js 一起,并成为前端三大主流框 ...

  5. Property 'validate' does not exist on type 'Element | Element[] | Vue | Vue[]'. Property 'valid...

    使用vue-cli 3.0+Element-ui时候,调用form表单校验时候出现的问题是: Property 'validate' does not exist on type 'Element | ...

  6. Vue Vue.use() / Vue.component / router-view

    Vue.use Vue.use 的作用是安装插件 Vue.use 接收一个参数 如果这个参数是函数的话,Vue.use 直接调用这个函数注册组件 如果这个参数是对象的话,Vue.use 将调用 ins ...

  7. vue & vue router & dynamic router

    vue & vue router & dynamic router https://router.vuejs.org/guide/essentials/dynamic-matching ...

  8. vue & vue router & match bug

    vue & vue router & match bug match bugs solution name must be router https://stackoverflow.c ...

  9. [Vue] vue中setInterval的问题

    vue中使用setInterval this.chatTimer = setInterval(() => { console.log(this.chatTimer); this.chatMsg( ...

  10. [Vue] vue跳转外部链接

    问题 vue 跳转外部链接问题,当跳转的时候会添加在当前地址后面 var url = 'www.baidu.com' //跳转1 window.localtion.href = url //跳转2 w ...

随机推荐

  1. AOP 与 Spring中AOP使用(上)

    AOP简介 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程, 通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. AOP是OOP的延续 ...

  2. 表单Content-Type为multipart/form-data时,后台数据的接收

    我们在写form提交表单的时候,后台大多数用request.getParameter的方式来接收前台输入的数据.但如果我们表单中提交的数据包含file文件传输的话,我们需要将Content-Type改 ...

  3. 灵活使用ssh、dsh和pssh高效管理大量计算机

    http://os.iyunv.com/art/201012/240113.htm 灵活使用ssh.dsh和pssh高效管理大量计算机 http://os.iyunv.com2010-12-23 09 ...

  4. Linux中split大文件分割和cat合并文件

    当需要将较大的数据上传到服务器,或从服务器下载较大的日志文件时,往往会因为网络或其它原因而导致传输中断而不得不重新传输.这种情况下,可以先将大文件分割成小文件后分批传输,传完后再合并文件. 1.分割 ...

  5. maven报错解决

    maven-resources-plugin prior to 2.4 is not supported by m2e. Use maven-  resources-plugin versio < ...

  6. 常用学习&面试资源网站

    https://github.com/MZCretin/RollToolsApi  开源通用API https://github.com/SenhLinsh/Android-Hot-Libraries ...

  7. 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_05-Feign远程调用-客户端负载均衡介绍

    2 Feign远程调用 在前后端分离架构中,服务层被拆分成了很多的微服务,服务与服务之间难免发生交互,比如:课程发布需要调用 CMS服务生成课程静态化页面,本节研究微服务远程调用所使用的技术. 下图是 ...

  8. Linux 7 关闭、禁用防火墙服务

    1 查看防火墙状态 [root@lvxinghao ~]# systemctl status firewalld 2 查看开机是否启动防火墙服务 [root@lvxinghao ~]# systemc ...

  9. web手工项目03-登录功能测试用例及缺陷编写-流程图画法-前后台下单及发货流程图-流程图设计测试用例方法-功能测试涉及到的四种数据库场景

    回顾 注册功能测试(步骤,需求分析(输入分析,处理分析,输出分析),数据构造(有效等价类,无效等价类,有效数据,无效数据),编写用例,执行用例,缺陷报告) 轮播图功能测试(步骤,需求分析拆分测试点,测 ...

  10. java cpu 使用率100%

    --宝典开始 top :查看 进程 ,选CPU使用率高的 获取进程ID,pid top -Hp pid:查看线程,选CPU使用率高的 获取线程ID,threadid printf "%X\n ...