当前位置:   article > 正文

Vue 详情页返回列表页,不刷新页面,并且保留列表页原来滚动条所在位置_vue详情页返回列表页

vue详情页返回列表页

前言:

最近公司有个移动端H5的项目,是前后端分离的,所以前端就Vue + Vux来做,项目是用vue-cli3生成的,其中就有这样的一个需求,在新闻列表页中向下滑动后,随别打开一个新闻,进入该新闻的详情页面,当看完后,从详情页返回到新闻列表页。这时,列表页重新请求接口数据,重新渲染DOM,而且滚动条也回到了最顶上的第1个新闻了。这样不仅性能不好,还会影响用户的体验效果。

 

问题分析:

1、从新闻详情页面返回新闻列表页后,新闻列表页重新渲染了DOM。

2、如果在新闻列表页向下滑动后,才进入新闻详情页面时,返回新闻列表页后滚动条回到最顶上了。

 

实现思路:

1、通过<keep-alive>容器组件,将页面缓存起来。

2、当路由跳转到其他页面时: beforeRouteLeave()方法,和 beforeRouteEnter()方法, 来记录 和 恢复滚动条的位置。

 

解决方法:

1、在router.js文件中,给News新闻列表页路由中添加 meta: {   keepAlive: true    //开启缓存  },代码如下:

  1. import Vue from 'vue'
  2. import Router from 'vue-router'
  3. Vue.use(Router)
  4. export default new Router({
  5. routes: [
  6. {
  7. path: '/Main',
  8. name: 'Main',
  9. component: () => import('../views/Main.vue')
  10. },
  11. {
  12. path: '/',
  13. name: 'News',
  14. component: () => import('../views/News.vue'),
  15. meta: {
  16. keepAlive: true //开启缓存
  17. }
  18. },
  19. {
  20. path: '/Info',
  21. name: 'Info',
  22. component: () => import('../views/Info.vue')
  23. }
  24. ]
  25. })

 

2、在App.vue文件中,在<template>中的<router-view />用<keep-alive>包裹起来,代码如下:

  1. <template>
  2. <div id="app">
  3. <keep-alive>
  4. <!-- 如果当前打开页面的路由中 keepAlive: true (开启了缓存时) -->
  5. <router-view v-if="$route.meta.keepAlive"></router-view>
  6. </keep-alive>
  7. <!-- 如果当前打开页面的路由中 没有 或者为 keepAlive: false (关闭缓存时[默认就是false]) -->
  8. <router-view v-if="!$route.meta.keepAlive"></router-view>
  9. </div>
  10. </template>

通过以上的两步设置以后,从新闻详情页面再返回新闻列表页时,新闻列表页就不会再重新渲染DOM了。

 

3、在News.vue页面中,添加以下两个监听方法,用于记录离开新闻列表页面时滚动条所在的位置,当返回新闻列表页面时设置滚动条的位置为之前所记录的值。

  1. // 离开路由之前执行的函数
  2. beforeRouteLeave(to, from, next) {
  3. // 如果在window中出现的滚动条
  4. // this.scroll = window.scrollTop;
  5. // 如果在某个指的元素中出现的滚动条 就在该素中添加ref属性,如:ref="listBox"
  6. this.scroll = this.$refs.listBox.scrollTop;
  7. next()
  8. },
  9. // 进入路由之前执行的函数
  10. beforeRouteEnter(to, from, next) {
  11. next(vm => {
  12. // 如果在window中出现的滚动条
  13. // window.scrollTop = vm.scroll;
  14. // 如果在某个指的元素中出现的滚动条 就在该素中添加ref属性,如:ref="listBox"
  15. vm.$refs.listBox.scrollTop = vm.scroll
  16. })
  17. }

注:我的滑动区域是在指定的div元素中出现的滚动条

通过以上的三步设置以后,从新闻详情页面再返回新闻列表页时,新闻列表页就不会再重新渲染DOM,返回列表页后,滚动条也回到了原来的位置。

 

扩展:

如何在vue中实时查看滚动条,滚动的位置的值。

  1. mounted() {
  2. // 监听window中滚动条的位置
  3. window.addEventListener('scroll', function(){
  4. let scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
  5. console.log(scrollTop);
  6. });
  7. // 监听指定某个元表滚动条的位置
  8. document.querySelector('#listBox').addEventListener('scroll', function(){
  9. let scrollTop = this.pageYOffset || this.scrollTop;
  10. console.log(scrollTop);
  11. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/731016
推荐阅读
相关标签
  

闽ICP备14008679号