一、前言

  1. 当使用路由跳转到其他页面的时候,要求缓存当前页面,比如列表页面跳转到详情页面,需要缓存列表内容,并且保存滚动条位置,也有时候需要缓存的页面里面有部分内容不缓存,总之各种情况,下面就列举其中一些例子
  2. vue2和vue3的使用方式是不一样的
  3. created()方法和mounted()方法在页面初始化的时候会执行,如果缓存了页面,这两个方法都不会再执行,还有如果缓存了页面,vue2中的destroyed()和vue3中的unmounted()方法都不会执行
  4. activated()方法在每次进入页面都会执行

二、使用

1.vue2和vue3的不同

vue2:

<template><div id="nav"><router-link to="/">Home</router-link> |<router-link to="/about">About</router-link></div><!-- vue2.x配置 --><keep-alive><router-view v-if="$route.meta.keepAlive" /></keep-alive><router-view v-if="!$route.meta.keepAlive"/>
</template>

vue3:

<template><div id="nav"><router-link to="/">Home</router-link> |<router-link to="/about">About</router-link></div><!-- vue3.0配置 Component是固定写法--><router-view v-slot="{ Component }"><keep-alive><component :is="Component"  v-if="$route.meta.keepAlive"/></keep-alive><component :is="Component"  v-if="!$route.meta.keepAlive"/></router-view>
</template>

route.js中配置:

path: '/',
name: 'Home',
component: Home,
meta:{keepAlive: true
}

效果:

2.页面某些数据不需要缓存

可以在activated()方法中处理需要部分刷新的逻辑

...
需要部分刷新的数据:<input type="text" v-model="newStr" />
...
data() {return {newStr: "2",};
},
mounted() {console.log("执行了mounted方法");this.newStr = "3";
},
activated() {console.log("执行了actived方法。。。");this.newStr = "4";
}

效果:

3.动态设置keepAlive属性

也可以在vue文件中设置keepAlive属性,实测只有在beforeRouteEnter()方法中添加才会生效,即进入页面的时候
在Home.vue中添加:

  // 使用组件内守卫,对离开页面事件做一些操作// to为即将跳转的路由,from为上一个页面路由beforeRouteEnter(to, from, next) {to.meta.keepAlive = true;// 路由继续跳转next();}

4.使用include,exclude配置需要缓存的组件

在app.vue中配置:

<router-view v-slot="{ Component }"><keep-alive include="testKA"><component :is="Component"/></keep-alive>
</router-view>

其中,testKA对应某个组件的name:

export default {name:'testKA',// keep-alive中include属性匹配组件namedata() {return {}},activated() {// keepalive缓存的页面每次进入都会进行的生命周期},
}

此外,include用法还有如下:

<!-- 逗号分隔字符串 -->
<keep-alive include="a,b"><component :is="view"></component>
</keep-alive><!-- 正则表达式 (使用 `v-bind`) -->
<keep-alive :include="/a|b/"><component :is="view"></component>
</keep-alive><!-- 数组 (使用 `v-bind`) -->
<keep-alive :include="['a', 'b']"><component :is="view"></component>
</keep-alive>

exclude用法与include用法相同,代表不被缓存的组件。

5.部分页面过来需要缓存,部分页面过来需要刷新

描述:如有a,b,c三个页面,a->b时,b刷新页面,然后b->c,c->b时,b不刷新页面,再b->a,a->b时,b刷新页面。
自测,只有配合vuex才能实现,但是缺点是,页面缓存的时候不执行activated()方法

6.缓存只在一级路由生效

如果需要在二级路由使用缓存,可以在一级路由中进行同样的配置

store.js代码:

state: {keepAlives:[]
},
mutations: {SET_KEEP_ALIVE(state,params) {state.keepAlives = params}
},
getters:{keepAlive:function(state){return state.keepAlives}
}

App.vue代码:

<template><div id="nav"><router-link to="/bbb">BBB</router-link> |<router-link to="/home">Home</router-link> |<router-link to="/about">About</router-link></div><router-view v-slot="{ Component }"><keep-alive :include="keepAlive"><component :is="Component"/></keep-alive></router-view>
</template>
<script>export default{computed:{keepAlive(){return this.$store.getters.keepAlive}}}
</script>

Home.vue代码:

// 使用组件内守卫,对离开页面事件做一些操作
// to为即将跳转的路由,from为上一个页面路由
beforeRouteEnter(to, from, next) {next(vm=>{if(from.path == "/bbb"){vm.$store.commit("SET_KEEP_ALIVE",["Home"])}});
},
beforeRouteLeave(to, from, next) {if (to.path == "/about") {console.log("将要跳转/about页面...")} else {console.log("将要跳转非/about页面...")this.$store.commit("SET_KEEP_ALIVE",[])}// 路由继续跳转next();
}

效果:

vue3缓存页面keep-alive+路由统一处理相关推荐

  1. Vue路由开启keep-alive缓存页面

    mode:hash模式下: HTML部分: <template><div id="app"><keep-alive> <!--使用keep ...

  2. vue中tab标签页keep-alive二级路由+删除指定缓存页面

    1.实现效果 2.keep-alive 2.1是什么: keep-alive 是 Vue 的内置组件,keep-alive 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们.和 transiti ...

  3. VUE3页面跳转路由跳转带参路由跳转

    VUE3页面跳转路由跳转带参路由跳转 第一种 第二种 第一种 跳转: import {useRouter} from "vue-router"; const router = us ...

  4. vue缓存页面【二】

    keep-alive是vue内置的一个组件,可以使被它包含的组件处于保留状态,或避免被重新渲染. 用法: 运行结果描述: input输入框内,路由切换输入框内部的内容不会发生改变. 在keep-ali ...

  5. react-router v6 路由统一管理及路由拦截方案

    2022-03-11 更新: 升级插件至1.1.3版本,支持 TypeScript. 2022-03-02 更新: 修复项目打包后可能无法加载路由的问题:升级插件至1.0.0版本,该版本使用方式上有差 ...

  6. vue返回上一页不刷新页面的方法 / vue缓存页面

    问题: vue框架下,在返回上一页的时候(this.$router.go(-1)) ,默认会让上个页面重新执行一遍生命周期(即被刷新了). 想达到的效果: 返回上一页不刷新页面. 解决方法: 缓存上一 ...

  7. 微信小程序开发系列 (四) :微信小程序的页面跳转路由设计

    笔者由于工作需要,曾经参加过一个微信小程序同 SAP 系统集成的项目,因此从零开始学习了微信小程序的开发知识.这里通过系列文章把自己所学分享出来,希望对相关学习者有所帮助. 本教程前面三篇文章: 微信 ...

  8. 如何在vue项目中,跨页面(跨路由)使用新手引导工具 Intro.js

    文章目录 功能要求 使用Intro.js遇到的问题以及代码 1.不能跨路由 utils -> intro.js 2.要在页面引导所需显示的数据全部拿到且渲染完毕以后加载Intro.js intr ...

  9. [Google API](6)拼写检查器和缓存页面

    作为 Google 创建索引过程的有机组成部分,Google 要检索被建立索引的页面副本,在搜索结果中为用户提供到缓存页面的链接.主要的缺点是用户看不到更新后的内容,但一些优点也是存在的. 检索缓存页 ...

最新文章

  1. 深入解析Java AtomicInteger 原子类型
  2. 《大型网站技术架构》读书笔记之六:永无止境之网站的伸缩性架构
  3. springboot 1.5.x 升级 spring-kafka 2.x NoSuchMethodError
  4. 非对称加密和对称加密的区别
  5. android message 代码,Android Handler移除Message详解及实例代码
  6. 8分钟答辩稿_5分钟学会8个答辩小套路,教资面试没在怕的啦!
  7. 调整latex表格_选择LaTeX还是Word的建议
  8. Palindrome subsequence HDU - 4632 区间dp|记忆化搜索
  9. 论文浅尝 - ICLR2020 | 通过神经逻辑归纳学习有效地解释
  10. oracle.sql.clob 报错,oracle11g java导出excel报错oracle.sql.CLOB@xxxx问题
  11. tcp压力测试工具_DNS压力测试工具之——DNSperf
  12. Android开发文摘集合1
  13. 数据--第21课-递归课后练习
  14. Python内置函数详解
  15. 为什么从Java开发转测试?
  16. AI英雄 | 揭秘李飞飞离职谷歌前后
  17. Android手势识别——上下左右滑动、屏幕上下左右中区域处理
  18. 移动相关术语:MSISDN
  19. Linux安装PPTP
  20. 上海大学计算机学院2021预推免,上海大学计算机工程与科学学院(专业学位)软件工程保研...

热门文章

  1. Flash与文件系统简介
  2. linux如何初始化根文件系统,搭建自己的Linux根文件系统
  3. 无氧铜的网线跟纯铜的网线有什么区别?
  4. 汉字如何造就世界上最伟大的文化整体
  5. 为何基于树的模型在表格型数据中能优于深度学习?
  6. Unity3d 周分享(17期 2019.5.18 )
  7. 涉密计算机等级如何确定,涉密信息系统的等级由()确定。
  8. 大道至简,职场上做人做事做管理
  9. 【交换机】网络交换机的作用
  10. prometheus remote write for springboot 远程写入<一>