vue-router3.0处理页面滚动部分源码分析

 

在使用vue-router3.0时候,会发现不同的路由之间来回切换,会滚动到上次浏览的位置,今天就来看看这部分的vue-router中的源码实现。

无论是基于hash还是history的路由切换,都对滚动进行了处理,这里分析其中一种即可。

无论是初始化,或者push,replace都对滚动进行了相应的处理。

下面我们详细看一下这个scroll.js

一、setupScroll

简单介绍下,getStateKey和setStateKey是用来生成和更新history state对应的key,用来存储在positionStore中。

extend方法实现一个简单的对象深度拷贝。positionStore用来存储不同路由对应的滚动位置。

为阻止popstate事件触发浏览器的默认行为,将history.scrollRestoration设置为manual手动控制。为防止用户覆盖history state将history state进行拷贝,注册popstate事件,将移除popstate的方法return出去,在调用处做统一处理。

二、handlePopState

该方法调用保存滚动位置方法,以生成的时间串作为key值。

三、saveScrollPosition

四、handleScroll

该方法会在相应的router变化中被调用,接收四个参数,前三个都已经相当熟悉了,isPop显式的声明是否触发了popstate change,没有触发就不进行滚动的操作。assert处理,如果没有scrollBehavior滚动行为函数,在非生产环境就将错误信息写入控制台。

在re-render完成之后进行滚动,判断shouldScroll是否有then方法,不同情况获取shouldScroll参数不同,之后执行scrollToPosition方法。

五、scrollToPosition

在这里先对传进来的selector进行解析,这里作者的注释很有意思,类似#main[data-attr]的id选择器依然会失败,但是都用了id选择器,再加属性貌似也没啥道理,但是底下的代码对这种情况依然进行的兼容处理。

底下一堆工具方法都是为了根据该selector计算出滚动的位置。

这里用到pageXOffset是有一个小的兼容问题,如下

最后获取到position调用window.scrollTo方法进行滚动。该工具方法会在相对应的路由动作中进行调用,isPop显式的控制是否滚动,

从而实现不同路由记住滚动位置的效果。

-- END --

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/12351.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot

文章目录 创建SpringBoot项目快速入门创建Controller启动项目 打包项目创建工件 SpringBoot概述SpringBoot优点起步依赖切换Web服务器 配置文件配置文件application.propertiesapplication.ymlapplication.yaml 三种配置文件优先级yaml格式读取配置数据(yml为例&…

windows系统管理_Windows server 2016 组管理与授权

组账户的概述 在 windows 服务器中,当我们需要为多个用户设置相同的权限时,一个一个的逐一设置会比较 麻烦,这个时候我们就需要用到另一种模式,组账户,使用此账户来进行简化操作。 在以后的职场中,每家公司…

Windows环境下调试DAB-DETR与Deformable-DETR

先前都是在服务器上运行DETR的相关程序,服务器使用的是Linux,所以运行较为简单,但如果想要简单的debug的话就没必要使用服务器了,今天便来在Winodws环境下调试DETR类项目,这里以Deformable-DETR与DAB-DETR为例。 首先是…

I.MX6U开发板使用OTG烧写系统

1.系统烧写 在实际的产品开发中肯定不可能通过网络来运行,否则没网的时候产品岂不 是就歇菜了。因此我们需要将 uboot、linux kernel、.dtb(设备树)和 rootfs 这四个文件烧写到板子 上的 EMMC、NAND 或 QSPI Flash 等其他存储设备上,这样不管有没有网络我…

R语言ggplot2 | 绘制随机森林重要性+相关性热图

📋文章目录 原图复现准备数据集及数据处理构建不同分类随机森林模型的并行计算绘制随机森林变量重要性柱状图计算数据集的相关性热图可视化合并随机森林重要性和热图 附上所有代码 在文献中,我们经常遇到随机森林和相关性热图的组合图片(下图)&#xff0…

Vue3——一文入门Vue3

Vue3的优势 1. 性能的提升 打包大小减少41% 初次渲染快55%,更新渲染快133% 内存减少54% … 2. 源码的升级 使用Proxy代替defineProperty实现响应式 重写虚拟DOM的实现和Tree-Shaking … 3. 拥抱TypeScript Vue3可以更好的支持TypeScript 4. 新的特性 1.C…

什么是文件共享软件?文件传输软件如何共享?

它是一个文件共享软件应用程序,可让强大的数据保护层下将任何大小的文件发送到世界上的任何地方。以光速发送和共享无限数量的文件。可以提交门户并使用语言,品牌,存储等自定义门户。可以选择一个存储点,例如文件传输软件&#xf…

零基础可以学习数据分析吗,有没有好的培训机构推荐?

数据分析从沿海火到了中西部的软件园,从传统互联网企业火到了新经济领域,火到了第一二产业。数字化成为这个时代的标签,而数据也成为了最有价值的资源,更多企业重视数据;因为有了真实数据的支撑,所有的决策…

【软考备战·希赛网每日一练】2023年4月19日

文章目录 一、今日成绩二、错题总结第一题第二题第三题 三、知识查缺 题目及解析来源:2023年04月19日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析: 第二题 解析: server-side n.服务器端 enterprise n.企业 client n.客户 d…

常见排序算法

目录 一、插入排序 1、直接插入排序 2、希尔排序(缩小增量插入排序) 二、选择排序 三、堆排序 四、冒泡排序 五、快速排序(递归) 1、交换法 2、挖坑法 3、前后指针法(推荐) 4、快排再优化 六、快速排序&…

树上差分(点差分/边差分)

树上差分一般有两种类型的题目,一种是对边进行差分,另一种就是对点进行差分。 对应的操作也有两种,对边进行差分的对应操作就是给定一对节点(u,v),让我们把u到v之间路径上的边权都加val,对点进行差分的对应操作就是给…

MYSQL数据库

目录 SQL SQL-DDL 操作数据库 查询(show)(select) 创建(create) 删除(drop) 操作表 查询当前数据库所有表 修改表 删除 SQL-DML 添加数据(可以批量添加&…

课程简介:.Net Core从零学习搭建权限管理系统

课程简介目录 🚀前言一、课程背景二、课程目的三、系统功能四、系统技术架构五、课程特点六、课程适合人员七、课程规划的章节八、最后 🚀前言 本文是《.Net Core从零学习搭建权限管理系统》教程专栏的导航站(点击链接,跳转到专栏…

做好Python工程师,首先你需要做好的几件事

做好Python工程师,需要做好的几件事,我想分享给大家。首先千万不要做事周折。在你提问之前,先好好想一想,这个问题自己能不能解决。如果能解决,尽量自己解决;如果解决不了,那就要把你的问题描述…

亿发软件:传统食品饮料批发行业如何通过信息化管理系统降本增效?

传统食品饮料批发行业信息化水平较低,存在多重管理难题,例如: 手动数据输入和管理,导致错误和效率低下; 数据缺乏实时可见性,无法实时了解企业仓库存量、销售额和其他关键业务指标; 低效的供应链…

索引:索引知识重复习,什么是索引、索引的类型、建立索引及【最左匹配原则】、Explain查看sql的执行计划

文章目录 什么是索引索引的类型主键索引(primary key)普通索引(index)复合索引全文索引(fulltext)空间索引唯一索引索引修改及删除 Explain一、using filesort(减慢查询效率)二、Using temporary三、using …

前端UI框架有哪些|20个优秀免费开源的WEB前端UI框架提高网站开发效率

最近准备学习一下前端UI我也是在网上找了很久最终整理出来了20个不错的前端UI框架网站,大家都知道很多成熟的前端框架可以直接引,学习框架可以提升我们网站的开发速度。有些大型公司的前端或者后端框架都是用自己开发的,对于大部分用户和公司来讲,我们可以用开源免费的前端…

Python 中 SyntaxError: ‘yield‘ outside function 错误

当我们在函数外部使用 yield 关键字时,会出现 Python “SyntaxError: ‘yield’ outside function”。 要解决该错误,如果我们需要对每个元素执行一些运算符,请使用列表理解,或者缩进函数内部使用 yield 的代码。 下面是一个产生…

毕业2年,跳槽到下一个公司就25K了,厉害了···

本人本科就读于某普通院校,毕业后通过同学的原因加入软件测试这个行业,角色也从测试小白到了目前的资深工程师,从功能测试转变为测试开发,并顺利拿下了某二线城市互联网企业的Offer,年薪 30W 。 选择和努力哪个重要&a…

写博客8年与人生第一个502万

题记:我们并非生来强大,但依然可以不负青春。 原本想好好写一下如何制定一个目标并通过一点一滴的努力去实现,这三年反思发现其实写自己的经历并不重要。 很多人都听过一句话:榜样的力量是无穷的。 更现实和实际的情况是&#x…