vue 页面切换根据需求是否保持缓存问题

Vue项目:

遇到需求:
在开发列表页和详情页的时候,遇到一个问题,当用户点击列表页跳转详情页,然后再返回列表页时,列表页会重新刷新,滚动条会到最上面,这样用户体验很差。而我想要的效果时当用户再次返回列表页时,内容应该是用户之前离开时候的内容,这样用户体验会好一点。
在这里插入图片描述
图一 分类页
在这里插入图片描述
图二 列表页
在这里插入图片描述
图三 详情页

首先我先想到的是vue的keep-alive进行组件的缓存
在这里插入图片描述
App.vue
在这里插入图片描述
router.js

但实际情况和我想得不一样,当我列表页进入详情页,在返回列表页时,没有任何问题,还是我原来的位置,但是。。。,但我回到分类页,在进入列表页就会出现下面的情况
在这里插入图片描述
之前的数据被缓存了,导致再次从分类页进入列表页,mescroll.js 上拉加载会在之前的数据上增加。这当然就是不行的,照我的想法,应该是用户从分类页进入列表页,是第一次加载的数据,所以我就放弃了keep-alive,这是一个伏笔。。。
然后我又想到了第二个方法,就是用cookie记录列表页点击进入详情页时,记住scrollTop的值,当用户从详情页返回列表页时,通过scrollTop的值,来让滚动条移动到用户离开的位置,最后离开列表页进入分类页时,将cookie清除,然而,想象很美好,现实很残酷。我没考虑到因为没有缓存,再次进入列表页数据会重新加载,又因为我是上拉加载的,导致如果用户是没有上拉加载数据就进入详情页,一切就如我想象一样美好,但是,要是用户上拉加载了新的数据,整个列表会变长,然后用户从详情页返回列表页时,因为数据重新加载,列表页重置,导致长度比离开之前的要小,最后,滚动条就只能移动到没上拉加载之前的数据那里。

问题又回到了原点,还是要缓存才行,但是我要解决的问题是,怎么让列表页进入详情页保持缓存,但分类页进入列表页又清除缓存?
然后我灵光一闪
在这里插入图片描述
在这里插入图片描述

我可以动态的修改 $route.meta.keepAlive 啊,哎,陷入了思维误区,浪费了我两个小时。。。
在这里插入图片描述

在列表页跳转详情页的时候,将this. r o u t e . m e t a . k e e p A l i v e = t r u e ; 从 而 让 页 面 保 持 缓 存 , 当 退 出 列 表 页 进 入 分 类 页 时 , 将 t h i s . route.meta.keepAlive = true; 从而让页面保持缓存,当退出列表页进入分类页时,将this. route.meta.keepAlive=true;退this.route.meta.keepAlive = false; 让页面清除缓存。问题成功解决,完美!

### Vue.js 路由切换 页面组件缓存 实现方法 在 Vue.js 中,为了优化用户体验并减少不必要的重复加载,可以利用 `<keep-alive>` 组件来实现页面组件的缓存。这使得当用户在同一应用的不同视图之间导航时,已访问过的页面不会每次都重新创建实例。 #### 使用 `keep-alive` 进行基本缓存 对于简单的场景,只需将目标路由对应的组件包裹于 `<keep-alive>` 标签内即可完成基础级别的缓存操作[^2]: ```html <template> <div id="app"> <!-- 匹配到的组件将会在此处显示 --> <router-view v-slot="{ Component }"> <transition name="fade" mode="out-in"> <component :is="Component" /> </transition> </router-view> <!-- 对特定路径下的组件启用缓存 --> <keep-alive> <router-view></router-view> </keep-alive> </div> </template> ``` 需要注意的是,默认情况下所有的子组件都会被缓存下来;如果希望仅针对某些特殊条件或指定名称/路径的组件实施缓存,则可以通过设置属性进一步控制其行为。 #### 高级配置:通过 include 和 exclude 控制缓存范围 有时可能只想要缓存部分页面而非全部,这时就可以借助 `include` 或者 `exclude` 属性来进行筛选[^4]: - **Include**: 列表中的组件名才会被缓存; - **Exclude**: 排除列表里的组件不参与缓存机制。 示例代码如下所示: ```html <!-- 只缓存名为 'Home' 的组件 --> <keep-alive include="Home"> <router-view></router-view> </keep-alive> <!-- 不缓存名为 'Login', 'Register' 的组件 --> <keep-alive exclude="Login, Register"> <router-view></router-view> </keep-alive> ``` 此外还可以结合正则表达式模式匹配更多复杂的规则。 #### 动态调整缓存策略 考虑到实际开发过程中可能存在更加灵活多变的需求,比如根据用户的交互动作即时改变某个页面是否应该被缓存的状态。此时可以在生命周期钩子里修改路由元信息(`meta`)字段从而达到目的[^3]: ```javascript beforeRouteLeave(to, from, next) { if (to.path !== '/specialPath') { this.$route.meta.keepAlive = false; } next(); } ``` 上述例子展示了如何在离开某一路由之前判断目的地地址,并据此决定源页面要不要继续保留其缓存副本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值