vue动态路由缓存【前进刷新、后退缓存】,美团架构师深入讲解前端开发

文章介绍了如何在Vue应用中使用keep-alive进行组件缓存,并通过`activated`和`beforeRouteLeave`钩子管理数据刷新。通过设置`isUseCache`字段,控制从详情页返回列表页时使用缓存,其他情况下刷新数据。
摘要由CSDN通过智能技术生成

// list是我们的搜索结果页面

{

path: ‘/list’,

name: ‘List’,

component: resolve => require([‘@/pages/list’], resolve),

meta: {

isUseCache: false, // 这个字段的意思稍后再说

keepAlive: true // 通过此字段判断是否需要缓存当前组件

}

},

上面的component: resolve => require([‘@/pages/list’], resolve)这里的组件引入方式可能和大家平时写的有些不一样,这里是为了路由的懒加载用的,大家可以忽略。按照正常的import引入也可以,

  • 刷新数据or缓存数据的实现:

说这之前,先简单说一下和缓存相关的vue钩子函数。

设置了keepAlive缓存的组件:

第一次进入:beforeRouterEnter ->created->…->activated->…->deactivated

后续进入时:beforeRouterEnter ->activated->deactivated

可以看出,只有第一次进入该组件时,才会走created钩子,而需要缓存的组件中activated是每次都会走的钩子函数。所以,我们要在这个钩子里面去判断,当前组件是需要使用缓存的数据还是重新刷新获取数据。思路有了,下面我们来实现:

// list组价的activated钩子

activated() {

// isUseCache为false时才重新刷新获取数据

// 因为对list使用keep-alive来缓存组件,所以默认是会使用缓存数据的

if(!this.$route.meta.isUseCache){

this.list = []; // 清空原有数据

this.onLoad(); // 这是我们获取数据的函数

}

},

这里的isUseCache 其实就是我们用来判断是否需要使用缓存数据的字段,我们在list的路由的meta中已经默认设置为false,所以第一次进入list时是获取数据的。

当我们从详情页返回时,我们把list页面路由的isUseCache设置成true,这样我们在返回list页面时会使用缓存数据:

// 详情页面的beforeRouteLeave钩子函数

beforeRouteLeave (to, from, next) {

if (to.name == ‘List’) {

to.meta.isUseCache = true;

}

next();

},

我们这里是在即将离开detail页面前判断是否返回的列表页。如果是返回list页面,则把list页面路由的isUseCache字段设置成true。为什么这样设置呢?因为我们对list组件使用的keep-alive进行缓存组件,其默认就是使用缓存的。而我们又在list组件的actived钩子函数中进行了判断:只有在list页面的isUseCache==false时才会清空原有数据并重新获取数据。所以此处设置isUseCache为true,此时返会list页面是不会重新获取数据的,而是使用的缓存数据。

detail返回list可以缓存数据了,那么search前往list页面时怎么让list页面不使用缓存数据而是获取新数据呢?我们重新回到list的activated钩子中:

// list组价的activated钩子

activated() {

// isUseCache为false时才重新刷新获取数据

// 因为对list使用keep-alive来缓存组件,所以默认是会使用缓存数据的

if(!this.$route.meta.isUseCache){

this.list = []; // 清空原有数据

this.onLoad(); // 这是我们获取数据的函数

} else {

this.$route.meta.isUseCache = false;

}

},

我们加了一行this.$route.meta.isUseCache=false;也就是从detail返回list后,将list的isUseCache字段为false,而从detail返回list前,我们设置了list的isUseCache为true。所以,只有从detail返回list才使用缓存数据,而其他页面进入list是重新刷新数据的。

至此,一个前进刷新、后退返回的功能基本完成了。

  • 在一种情况,缓存页 进入的不是detail页面,而是去的别的页面,返回的时候也不让缓存也刷新,

在进入的页面中写钩子函数:

beforeRouteLeave (to, from, next) {

console.log(to.name)

console.log(from.name)

//打印一下值 哪一个打印的值等于缓存页面的name 那钩子if 判断语句中就写to.name或者 from.name

//条件和判断语句中一起变动, 要么都是to. 要么都是from.

if (to.name == ‘List’) {

to.meta.isUseCache = true;

}

next();

},

这种缓存页面进入别的页面,从别的页面返回缓存页面,不刷新,其实就是当返回缓存页面的时候,在activated钩子函数进入的是else条件语句,而不是进入的刷新页面语句

不管是列表缓存页面进入详情页,还是进入其他的页面,返回时位置不变,是要和滚动事件搭配使用

//1.给窗口添加滚动事件

window.addEventListener(“scroll”, () => {

// console.log(123)

var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;

// console.log(scrollTop)

// 获取到页面的滚动出的距离,把值存在缓存中,

},true);

等到返回到缓存页面的时候 可以在activated钩子函数中的else中 和 this.$route.meta.isUseCache = false写一起 , 设置滚动出去的距离就等于从localStorage.getItem() 拿出存的距离,这样就做好了,可以用beforeRouteLeave钩子函数想让哪个页面刷新或者不刷新都可以做到了

activated() {

// isUseCache为false时才重新刷新获取数据

// 因为对list使用keep-alive来缓存组件,所以默认是会使用缓存数据的

if(!this.$route.meta.isUseCache){

this.list = []; // 清空原有数据

this.onLoad(); // 这是我们获取数据的函数

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

JavaScript 和 ES6

在这个过程你会发现,有很多 JS 知识点你并不能更好的理解为什么这么设计,以及这样设计的好处是什么,这就逼着让你去学习这单个知识点的来龙去脉,去哪学?第一,书籍,我知道你不喜欢看,我最近通过刷大厂面试题整理了一份前端核心知识笔记,比较书籍更精简,一句废话都没有,这份笔记也让我通过跳槽从8k涨成20k。

JavaScript部分截图

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!**](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 27
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值