Vue切换路由,页面回到上一次缓存的滚动位置(代码量少,通用有效)

2023-11-09

需求:

当切换不同路由时,期望切换后的路由页面保留上次滚动的位置。

解决思路:

利用路由中的meta属性,对不同路由页面滚动的位置做缓存,切换路由时,获取当前路由meta属性中缓存的滚动位置,再自动滚动到此位置即可。

具体代码:

router.js文件

		<!-- 操作一 -->
		// 在meta属性中增加scrollTop属性
		{
        path: 'goodList',
        name: 'goodList',
        meta: {
          title: '商品列表',
          scrollTop: 0
        },
        component: resolve => require(['@/pages/goodList/index.vue'], resolve)
      },

layout.vue文件

		<!-- 操作二 -->
		// 在指定内容页视图元素中,添加ref属性及mousewheel事件
        <div ref="scrollView" @mousewheel="scrollChange">
          <keep-alive>
            <router-view v-if="!needRelogin" :key="$route.fullPath" ref="pageView"></router-view>
          </keep-alive>
        </div>
        
		<!-- 操作三 -->
        // methods中定义滚动监听事件,设置路由meta属性里面的指定参数
	    scrollChange(e) {
	      console.log('父滚动条到页面顶部距离', e.target.offsetTop)
	      console.log('相对距离', this.$refs.scrollView.scrollTop)
	      console.log('绝对距离', e.target.offsetTop + this.$refs.scrollView.scrollTop)
	      // 设置路由参数scrollTop等于当前元素的相对距离
	      this.$route.meta.scrollTop = this.$refs.scrollView.scrollTop
	    }
	
		<!-- 操作四 -->
	    // monted中给元素添加滚动监听
		mounted() {
		    // 获取指定元素
		    const scrollView = this.$refs['scrollView']
		    // 添加滚动监听
		    scrollView.addEventListener('scroll', this.scrollChange, true)
		},

		<!-- 操作五 -->
		// 销毁监听
		 beforeDestroy() {
		    // 获取指定元素
		    const scrollView = this.$refs['scrollView']
		    // 移除监听
		    scrollView.removeEventListener('scroll', this.scrollChange, true)
		 },

		<!-- 操作六 -->
		// 监听路由变化时,自动滚动到上次缓存的位置
		 watch: {
		    '$route.path': {
		      handler: () => {
		        // 自动滚动到上一次缓存位置
		        this.$nextTick(() => {
		          this.$refs.scrollView.scrollTo(0, this.$route.meta?.scrollTop || 0)
		        })
		      },
		      // 深度观察监听
		      deep: true
		    }
		 },

备注: 以上就是所有代码啦,本文所提供的方法可适用于所有vue工程项目,可解决vue-router 所提供方法 scrollBehavior 和 keepAlive不生效等问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue切换路由,页面回到上一次缓存的滚动位置(代码量少,通用有效) 的相关文章

随机推荐

  • [docker学习笔记] 11.docker网络模式及容器间网络通信

    docker的容器之间需要进行业务通信 11 1 默认网络 初始安装docker 之后 有三种网络 可以通过 docker network ls 查看 root localhost docker network ls NETWORK ID
  • 常用校验码(奇偶校验码、海明校验码、CRC校验码)

    常用校验码 奇偶校验码 海明校验码 CRC校验码 一 奇偶校验码二 海明校验码三 CRC校验码 计算机系统运行时 各个部之间要进行数据交换 交换的过程中 会有发生误码的可能 即0变成1或1变成0 由于计算机的储存是通过二进制代码来实现的的
  • C#连接云服务器MySql数据库

    环境 vs2017 第一步 在主窗口代码区新建一个类 用于连接数据库 在开发过程中其他窗口 常常也需要 对数据库进行操作 如果在每一个窗口的代码区域都连接一次数据库的话 就会很麻烦 所以在主窗口先用一个公共类连接了数据库 其他窗口就可以直接
  • go 进阶 请求代理相关: 一. 基于原生HTTP实现请求代理

    目录 一 代理基础概念了解 什么是正向代理 什么是反向代理 二 基于原生HTTP实现代理 简单正向代理示例 简单反向代理示例 上方代理中可能存在的问题 一 代理基础概念了解 什么是正向代理 是一种客户端的代理技术缩写为 forward pr
  • HarmonyOS云开发基础认证

    单选 答案 Cloud DB的数据同步模式包括缓存模式和本地模式 应用可以仅使用缓存模式 或者本地模式 也可以同时使用缓存模式和本地模式 正确 True Cloud DB服务在通过OnSnapshotListener类中的onSnapsho
  • MISRA-2012 规则整理

    说明 为了方便标准的对照 标题从8 1开始 目录 8 1 一个标准C环境 8 2 不使用的代码 8 3 注释 8 4 字符集 8 5 标识符 8 6 类型 8 7 常量 8 8 声明与定义 8 9 初始化 8 10 基本数据类型 8 11
  • 华为OD机试真题 整数对最小和 JavaScript java python c++ 参考解题

    题目描述 给定两个整数数组 array1 array2 数组元素按升序排列 假设从array1 array2中分别取出一个元素可构成一对元素 现在需要取出K个元素 并对取出的所有元素求和 计算和的最小值 注意 两对元素如果对应于array1
  • 在navicat中做数据库建模

    前几天 项目经理和我说要我把最近这个项目的数据表做一个关联图 我一想 这不就是数据库建模了嘛 可是公司电脑里没有power designer啊 公司电脑里还不能装外部来源的软件 这咋办 难不成要手工画图 想想就头疼 无意中就发现了navic
  • LVGL V8之flex grow

    flex grow布局 static void lv example flex 3 void lv obj t cont lv obj create lv scr act 当前活动界面创建obj对象作为容器 lv obj set size
  • 《STL源码剖析》深入剖析理解

    目录 提示 这里可以添加系列文章的所有文章的目录 目录需要自己手动添加 前言 标准程序库和STL概论 空间配置器解析 提示 写完文章后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 目录 前言 标准程序库和STL概论 空间配置器
  • OpenWrt 修改源码的密码配置(七)

    通过修改源码方式 修改账号及密码 修改密码 package base files files etc shadow root 0 0 99999 7 daemon 0 0 99999 7 ftp 1 BKbzZZm0 nrDMDt2K5Yu
  • qt修改构建套件

    1 qtcreator 工具 选项 qtVersion 添加 选择要添加的qmake 2 点击构建套件 选择对应的编译器 3 选择对应的调试器 解决can not find qmake conf问题
  • Synchronized(对象锁)和Static Synchronized(类锁)的区别

    Synchronized和Static Synchronized区别 通过分析这两个用法的分析 我们可以理解java中锁的概念 一个是实例锁 锁在某一个实例对象上 如果该类是单例 那么该锁也具有全局锁的概念 一个是全局锁 该锁针对的是类 无
  • 打造万物识别之利器!微信扫一扫植物识别篇技术解析

    导语 冬去春来日渐暖 柳絮萌芽草生根 立春已过 又到了户外踏青赏花的季节 再过段时间 公园 郊外 路边各种鲜花都会渐次开放 大家踏春的时候都会拍一些好看的照片 发一些朋友圈 写一些花语 市场上也出现了不少识花app 用户下载app 拍张照片
  • 单播与多播mac地址

    MAC 地址 Media Access Control Address 是一个用于识别网络设备的唯一标识符 每个网络设备都有一个独特的 MAC 地址 用于在局域网中进行通信 单播MAC地址 单播MAC地址用于单播通信 即一对一的通信模式 当
  • static静态代码块

    static静态代码块 public class Person 静态代码块 在类加载时候执行静态代码块 只会执行一次 static System out println Person static initializer 实例初始化块 每次
  • 富文本编辑器 VUE-QUILL-EDITOR 使用教程

    一 基础用法 1 NPM 导入 VUE QUILL EDITOR npm install vue quill editor save 2 引入 VUE QUILL EDITOR 在全局中引入 import Vue from vue impo
  • 如何实现单链表任意两个元素交换(不包括表头)

    凭第一感觉写的版本 算法和思路有好的想法再优化 交换链表任意两个元素 void SwapItem LinkedList head int posA int posB 从非头结点开始交换操作 保证至少存在两个节点 assert head he
  • 教你如何用C语言做一个简单的贪吃蛇

    小时候大家可能都玩过贪吃蛇 但有没有想过自己做一个出来玩玩看 今天我们就教大家用C语言做一个简单的贪吃蛇游戏 这里没有采用图形界面去做 而是采用win32控制台 首先 先把做好的游戏初始界面和游戏截图先展示一下 游戏初始界面如图 游戏截图如
  • Vue切换路由,页面回到上一次缓存的滚动位置(代码量少,通用有效)

    需求 当切换不同路由时 期望切换后的路由页面保留上次滚动的位置 解决思路 利用路由中的meta属性 对不同路由页面滚动的位置做缓存 切换路由时 获取当前路由meta属性中缓存的滚动位置 再自动滚动到此位置即可 具体代码 router js文