vue keep-alive移动端详情返回列表记录滚动条位置

移动端详情返回列表页时,记录滚动条位置,踩了不少坑之后,终于有效解决,特此记录

要用到keep-alive缓存,及缓存时用到的activated和deactivated两个生命周期函数

1:首页在App.vue和路由中配置keep-alive缓存

 <div id="app">
    <!--根据keepAlive,判断页面是否需要缓存-->
    <keep-alive>
      <router-view v-if="$route.meta.keepAlive"></router-view>
    </keep-alive>
    <router-view v-if="!$route.meta.keepAlive"></router-view>
  </div>

router中

 {
    path: '/app/checkList',
    name: 'checkList',
    // 加入keepAlive,不需要缓存的页面不用加
    meta: {
      keepAlive: true
    },
    component: () => import('@/views/checkList/checkList.vue')
  },

2.列表-list页面:页面用的vantUI的list,如果是其他标签,只需要找到对应的scrollTop就可

点击列表项进入详情时,保存scrollTop,从详情返回列表时,列表数据已被缓存,只需要重新设置scrollTop,就可以记录位置

    jumpDetail (type, item) {
      this.$route.meta.keepAlive = true
      let vanTabs = this.$refs.vanTabs.scroller.scrollTop;
      // 由于有缓存,直接保存在data中就可以,数据并不会丢失
      this.scroll = vanTabs
      this.$router.push({
          name: 'warnDetail',
          query
      })
    }
         <van-pull-refresh v-model="noRefresh" @refresh="noList" ref="pullItem">
            <van-list
              v-model="no.loading"
              :finished="no.finished"
              finished-text="没有更多了"
              @load="onLoadNo"
              ref="vanList"
            >
              <div @click="jumpDetail"></div>
            </van-list>
          </van-pull-refresh>

3.进入页面时保存上一个页面的路由名字,如果是来自详情页,就重新赋值

  beforeRouteEnter (to, from, next) {
    next(vm => {
      vm.beforeUrl = from.name
    })
  },
  activated () {
    // 必须要在nextTick中,不然获取到的上个页面是上上个页面
    this.$nextTick(() => {
      if (this.beforeUrl === 'appHome') {
        this.$route.meta.keepAlive = false
      } else {
        this.$refs.vanTabs.scroller.scrollTop = this.scroll
        console.log(this.$refs.vanTabs.scroller.scrollTop)
      }
    })

 

3.以上代码,会造成首次进入列表页时,不会重新加载数据,也是用的缓存数据

所以在离开页面时,要判断,如果去的是详情页,把keepAlive改成true,如果去的是其他页面,keepAlive改为false

此时就完美的实现了详情返回列表时保存滚动条位置

  beforeRouteLeave (to, from, next) {
    // 去的不是详情页,不需要缓存
    if (to.name === 'appHome') {
      this.$route.meta.keepAlive = false
    }
    next();
  },

 


版权声明:本文为qq_44712405原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。