详情页返回列表页,列表状态缓存

本文介绍了如何在Vue应用中解决从企业列表页面跳转到详情页时,通过`keep-alive`缓存状态并保持滚动位置的问题。作者首先解释了原始问题和解决方案,并提到了`scrollBehavior`的使用,以确保列表页面加载后能快速定位到之前的位置。
摘要由CSDN通过智能技术生成

移动端的时候从企业列表页面点击到企业详情页面的时候,因为列表数据项非常多。需要我们缓存页面的状态且回复到原来滚动条的位置。

参考地址:

vue keep-alive 缓存 不生效解决方案_娃哈哈_的博客-CSDN博客_keepalive不起作用

原代码:

<keep-alive v-if="$route.meta.keepAlive">

        <router-view></router-view>

      </keep-alive>

      <router-view v-else></router-view>

引用原因分析:

通过v-if来判断是否生成keep-alive,当列表页面A符合条件时,内存缓存了组件状态。当跳转到详情页B时,不符合条件,由于v-if是挂载到keep-alive标签上,会把之前keep-alive的列表页面A进行销毁,再次进入到A会重新创建。

修改后:

<keep-alive>

        <router-view v-if="$route.meta.keepAlive"></router-view>

      </keep-alive>

      <router-view v-if="!$route.meta.keepAlive"></router-view>

可以实现缓存页面的状态了,但是发现回到了列表页面以后滚动条回到了顶部的位置,列表项数据很多,我们不太容易方便找到原来的列表项信息。因而我们还需要处理当从详情页返回到列表页时滚动条继续在原来的位置。

参考地址:

vue-router中scrollBehavior的妙用--使用keep-alive标签后返回页面指定位置_aliven1的博客-CSDN博客

const createRouter = () =>

  new Router({

    // mode: 'history', // 如果你是 history模式 需要配置vue.config.js publicPath

    // base: process.env.BASE_URL,

    /**  为什么不能直接return而必须使用异步滚动操作呢

     *   必须使用异步滚动,利用setTimeout跳出主线程将回调事件放到队列中。由于mouted比scrollBehavior函数早执行,所以异步请求的回调事件优先进入队列,接下去才是setTimeout的回调事件。根据队列

         先进先出的原理。先执行了异步请求回调事件对data中的变量a做赋值操作。此时相当于这已经是个静态页面了,接着我只要执行return {

         x:0, y: 100}。这样就已经触发了页面滚动到100px的效果。但是由于data数据发生改变,页面重新渲染又回到顶部。这时整个轻触滚动效果已经暗中执行完成,不会再出现遮罩层了。

     */

    scrollBehavior(to, from, savedPosition) {

      // keep-alive 返回缓存页面后记录浏览位置

      if (savedPosition && to.meta.keepAlive) {

        return savedPosition

      }

      // 异步滚动操作

      return new Promise(resolve => {

        setTimeout(() => {

          resolve({ x: 0, y: 1 })

        }, 0)

      })

    },

    // scrollBehavior: () => ({ y: 0 }),

    routes: constantRouterMap

  })

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值