甲爸爸提了一个需求,希望公众号内的商城能够像app一样,从商品详情页跳转至列表页及其他列表页时,可以实现列表页缓存(数据不刷新、位置固定到之前点的商品的位置)
本来想着scrollBehavior应该可以满足,但是实际操作中发现:如果列表带着分页,位置是不会定位到点击的位置的
在网上转了一圈,终于找到适合自己的方法——beforeRouteLeave
注:beforeRouteLeave只对一级页面起作用,不适用于children中的其他二级或其他级别的页面
以上是准备工作,接下来 可以步入正题了:
找到入口挂载页面:App.vue 在router-view外部包裹一个keep-alive的标签
因为不是所有页面都需要缓存,所以把需要缓存的页面中加入name值,并将name值加入keep-alive中
<keep-alive v-if="isRouterAlive" include="starShop" > <router-view></router-view> </keep-alive>
当然,仅仅是这些,是不能实现缓存的,
刚开始我是学着网上的方法,这样写的,当从列表点入详情页时,就将 列表页的keepalive值,赋为true (实现缓存)
beforeRouteLeave(to, from, next) { if(from.path == '/sale/newGoods/index' && to.path == '/goods/detail') { from.meta.keepAlive = true; this.loading = true; next(); return } else { from.meta.keepAlive = false; window.location.reload(); this.$destroy(); next(); return } },
但是后期甲爸爸发现一个bug: 当我从列表一点击进入详情之后,如果直接从详情页,点击进入别的店铺列表页,即列表二,最新的列表页内展示的商品列表是之前的数据,并没有变为最新的店铺列表内容 , 即列表二页面展示的还是列表一的商品
玩大了,这个问题比较着急啊,万一把顾客绕晕了,人家不买东西了,那我罪过不就大了咩
晚上趁着月黑风高、夜深人静的时候,我苦思冥想,终于把这个社会毒瘤挖掉了
我绝不是屈居于甲爸爸的淫威之下,只是因为我对技术的执著,过度追求完美的我,忍受不聊我的东西出现这样大的漏洞
要看解决办法的直接来这 ↓↓↓↓↓↓
首先摒弃上面的列表页面的方法
第一步:找到商品详情页,最为主角之一,我在这里用到了beforeRouteEnter、beforeRouteLeave
beforeRouteEnter (to, from, next) { next(vm =>{ vm.formUrl = from.path; console.log(vm.formUrl) }); }, beforeRouteLeave(to, from, next) { to.meta.keepAlive = false; if(to.path == this.formUrl){ to.meta.keepAlive = true; next(); return }else{ to.meta.KeepAlive = false; window.localStorage.removeItem('isRefresh') this.$destroy(); next(); return } },
beforeRouteEnter:进入路由之前执行的函数(拿到列表一的路由)
beforeRouteLeave:离开路由之前执行的函数(拿到列表二的路由)
通过这两个钩子,可以成功的拿到事件的另外两位主角路由(列表一、列表二)
在详情页中,当离开该页之前,在beforeRouteLeave内进行列表一、列表二的路由比较
若两路由相同,则跳转目的页面(to.meta.keepAlive)值为true,列表页面进行缓存(比如从详情页返回的时候)
若两路由不同,则跳转目的页面发生了变化(比如从鞋帽列表——>鞋子商品——>鞋子列表),则鞋子列表页面不需要缓存,需要刷新获取最新的鞋子列表数据
第二步:处理事件的第二主角——列表页面
这里我仅用到了beforeRouteEnter
这个钩子中,我们可以拿到当前页面的keepAlive值
这个值是在详情页中就已经给定的
如果是true,表示缓存,否则为不缓存(刷新)
防止页面一直刷新,变成死亡函数,我们要在data中声明一个变量isRefresh
isRefresh: window.localStorage.getItem('isRefresh') || true
beforeRouteEnter (to, from, next) { next(vm =>{ if(to.meta.keepAlive != true && to.meta.keepAlive != null){ vm.goods=[]; window.localStorage.setItem('isRefresh',true) if(JSON.stringify(window.localStorage.getItem('isRefresh')) != false){ window.localStorage.setItem('isRefresh',false) location.reload(); } } }); return },
如果当前页to.meta.keepAlive值不为true,且值存在,则需刷新页面
防止页面一直刷新,
window.localStorage.setItem('isRefresh',true)
设置缓存变量isRefresh,值为true(表示需要刷新)
当to.meta.keepAlive值不为true且isRefresh值为true,页面刷新,且isRefresh赋值为false,即关闭刷新
vm.goods=[];是当页面跳去新的列表页刷新之前,会出现短暂的列表展示,为了避免不必要的误导,在检测到是跳转到新的列表页时,我将列表页的goods列表情况,视觉感受会好一些
因项目不同而异,不需要可以去掉
多张页面之间跳转,判断是否需要缓存或刷新获取新数据,就是这样了
或许因为业务需求不同,技术处理方式可能会不同,希望能帮助到各位,或者给各位一些启发,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 三国志8重制版恶名怎么消除 恶名影响与消除方法介绍
- 模拟之声慢刻CD《柏林之声5》2019[原抓WAV+CUE]
- AlexandraSoumm-Parisestunefte(2024)[24Bit-96kHz]FLAC
- 李嘉《国语转调1》[天王唱片][WAV整轨]
- 不是哥们 这都能跑?网友展示用720显卡跑《黑神话》
- 玩家自制《黑神话:悟空》亢金星君3D动画 现代妆容绝美
- 大佬的审美冲击!《GTA6》环境设计师展示最新作品
- 纪晓君.2001-野火·春风【魔岩】【WAV+CUE】
- 汪峰.2005-怒放的生命【创盟音乐】【WAV+CUE】
- 群星.1995-坠入情网【宝丽金】【WAV+CUE】
- 群星《谁杀死了Hi-Fi音乐》涂鸦精品 [WAV+CUE][1G]
- 群星1998《宝丽金最精彩98》香港首版[WAV+CUE][1G]
- 汪峰《也许我可以无视死亡》星文[WAV+CUE][1G]
- 李嘉-1991《国语转调2》[天王唱片][WAV整轨]
- 蔡琴2008《金声回忆录101》6CD[环星唱片][WAV整轨]