【vue使用keep-alive引起的页面错乱】vue 使用keep-alive出现页面错乱问题

需求:产品要求页面A跳转页面B,然后返回页面A,返回时页面要滚动到上次离开的位置

1.听到这个需求首先想到的是利用vue路由中的滚动行为,但是这个功能使用是有条件限制的。vue 路由滚动行为 只能适用于路由模式是history模式,项目使用的是hash模式,所只能想其他办法了。
2.然后想到的是利用keep-alive缓存

  1. 首先再你的路由表中设置keepAlive字段,你所需要缓存的页面
    在这里插入图片描述

  2. 然后再router-view使用keep-alive组件
    在这里插入图片描述
    注意这个key,这个key属性有大的作用,很关键

  3. 然后使用beforeRouteLeave路由导航守卫,将离开时的scrollTop值记录起来,缓存的组件,页面B返回页面A,页面A的生命周期不会触发created这个钩子函数的,但是这个activated钩子函数会触发,所以如果要数据请求的话,写在activated这个钩子函数中

 beforeRouteLeave(to, from, next) {
      // 离开组件时保存滚动位置
      // 注意, 此时需调用路由守卫`beforeRouterLeave`而非生命周期钩子`deactivated`
      // 因为, 此时利用`deactivated`获取的 DOM 信息已经是新页面得了
      this.scrollTop = document.documentElement.scrollTop;
      next();
  },
  activated() {
    this.getList()
  },

完成以上就可以解决,页面A跳转到页面B,然后返回页面A,页面滚动到离开时的位置。
说明一下页面A,页面B,页面C都是页面D的children路由,并且都使用了缓存。
随意多点了页面跳转,bug突然就来了。

先点击页面C,然后再点击页面A,再点击页面B,本来是显示页面B的但是却显示页面C,这时出现了页面错乱。出现这个问题,首先想到的就是缓存引起的bug,然后去路由表把KeepAlive字段设置false,果然就不会出现页面错乱。

遇到问题不会怎么办?那当然是百度问度娘啦!果然不止我一个人遇到这个问题看到这篇博客按照这篇博客方法试一试,把父级路由的路由加载方式有懒加载变成常规加载。
一开始我在router-view 没有加key的属性的,结果就是没作用,还是会出现页面错乱。

突然间灵光闪现出这个router-view这个key属性,试一试果然有用!
router-view这个key用什么作用呢?自行百度一波,兄嘚。简单来说就是vue会复用相同的组件,加了key组件强制不复用。。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue中,使用`<keep-alive>`组件可以缓存组件的状态,使得在组件之间切换时保留组件的状态。当没有使用`<keep-alive>`组件时,每次切换到一个新的组件时,旧的组件会被销毁,下次再切换回来时需要重新创建。 下面是一个简单的例子来演示无`<keep-alive>`和有`<keep-alive>`页面来回切换的区别。 ```vue <template> <div> <button @click="toggle">Toggle</button> <!-- 无 keep-alive --> <div v-if="showComponent"> <ComponentA /> </div> <!-- 有 keep-alive --> <keep-alive> <div v-if="showComponent"> <ComponentB /> </div> </keep-alive> </div> </template> <script> import ComponentA from './ComponentA.vue' import ComponentB from './ComponentB.vue' export default { components: { ComponentA, ComponentB }, data() { return { showComponent: true } }, methods: { toggle() { this.showComponent = !this.showComponent } } } </script> ``` 在上述代码中,我们有两个组件:`ComponentA`和`ComponentB`。当点击"Toggle"按钮时,`showComponent`的值会切换,控制两个组件的显示和隐藏。 如果没有使用`<keep-alive>`,每次切换时,旧的组件会被销毁,然后重新创建新的组件。这意味着组件的状态会丢失,所有的数据和计算属性都会被重置。 如果使用了`<keep-alive>`,在切换时旧的组件不会被销毁,而是被缓存起来。这样,切换回来时组件的状态会被保留,数据和计算属性等都会保持不变。 所以,使用`<keep-alive>`可以提高页面切换的性能,并且保留组件的状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值