当前位置: 首页 > news >正文

vueRouter中scrollBehavior实现滚动固定位置

使用前端路由,当切换到新路由时,想要页面滚到顶部,或者是保持原先的滚动位置,就像重新加载页面那样。 vue-router 能做到,而且更好,它让你可以自定义路由切换时页面如何滚动。

注意: 这个功能只在 HTML5 history 模式下可用。

当创建一个 Router 实例,你可以提供一个 scrollBehavior 方法:

const router = new VueRouter({routes: [...],scrollBehavior (to, from, savedPosition) {// return 期望滚动到哪个的位置}
})

scrollBehavior 方法接收 tofrom 路由对象。第三个参数 savedPosition 当且仅当 popstate 导航 (通过浏览器的 前进/后退 按钮触发) 时才可用。

这个方法返回滚动位置的对象信息,长这样:

  • { x: number, y: number }
  • { selector: string, offset? : { x: number, y: number }} (offset 只在 2.6.0+ 支持)

如果返回一个 falsy (译者注:falsy 不是 false,参考这里)的值,或者是一个空对象,那么不会发生滚动。

举例:

scrollBehavior (to, from, savedPosition) {return { x: 0, y: 0 }
}

对于所有路由导航,简单地让页面滚动到顶部。

返回 savedPosition,在按下 后退/前进 按钮时,就会像浏览器的原生表现那样:

scrollBehavior (to, from, savedPosition) {if (savedPosition) {return savedPosition} else {return { x: 0, y: 0 }}
}

如果你要模拟『滚动到锚点』的行为:

scrollBehavior (to, from, savedPosition) {if (to.hash) {return {selector: to.hash}}
}

我们还可以利用路由元信息更细颗粒度地控制滚动。查看完整例子:

const scrollBehavior = (to, from, savedPosition) => {if (savedPosition) {// savedPosition is only available for popstate navigations.return savedPosition} else {const position = {}// new navigation.// scroll to anchor by returning the selectorif (to.hash) {position.selector = to.hash}// 如果meta中有scrollTopif (to.matched.some(m => m.meta.scrollToTop)) {// cords will be used if no selector is provided,// or if the selector didn't match any element.position.x = 0position.y = 0}// if the returned position is falsy or an empty object,// will retain current scroll position.return position}
}

keepAlive结合,如果keepAlive的话,保存停留的位置:

scrollBehavior (to, from, savedPosition) {if (savedPosition) {return savedPosition} else {if (from.meta.keepAlive) {from.meta.savedPosition = document.body.scrollTop;}return { x: 0, y: to.meta.savedPosition ||0}}
}

在文档页面(http://localhost:8080/document)拉动滚动条,然后刷新浏览器会发现滚动条依然在原来的位置,这是浏览器的默认行为,会记录浏览器滚动条默认位置。

但是点击浏览器“前进/后退”按钮,会发现当初那个页面的滚动条从0开始了,没有记录上一次滚动条的位置。现在要求点击浏览器“前进/后退”按钮,页面滚动条要记录上一次的位置,这时需要设置它的的滚动行为。

这时候需要在路由配置中设置 scrollBehavior(to,from,savePosition)函数,函数有三个参数。scrollBehavior() 函数在点击浏览器的“前进/后退”,或者切换导航的时候触发。

scrollBehavior(to,from,savePosition){ // 在点击浏览器的“前进/后退”,或者切换导航的时候触发。console.log(to) // to:要进入的目标路由对象,到哪里去console.log(from) // from:离开的路由对象,哪里来console.log(savePosition) // savePosition:会记录滚动条的坐标,点击前进/后退的时候记录值{x:?,y:?}}
let router = new VueRouter({mode:'history',//默认是hash模式linkActiveClass:'menvscode-active',scrollBehavior(to,from,savePosition){ // 在点击浏览器的“前进/后退”,或者切换导航的时候触发。console.log(to) // to:要进入的目标路由对象,到哪里去console.log(from) // from:离开的路由对象,哪里来console.log(savePosition) // savePosition:会记录滚动条的坐标,点击前进/后退的时候记录值{x:?,y:?}if(savePosition) {return savePosition;}else{return {x:0,y:0}}},routes:[{path:'/',name:'index',component:Home,},{path:'/home',name:'Home',//name代表当前的路由component:Home,alias:'/index' //当访问'/index'的时候,就能匹配到当前的路由了。},{path:'/document',name:'Document',components:{ // 多个视图的时候,默认渲染default的视图。default:Document,slider:Slider,home:Home}}]
})
export default router

我们还可以设hash来控制滚动行为,定位到某一位置

if(to.hash){ //先判断目标路由有没有hash值return {selector:to.hash}
}

App.vue:在路径后面添加 hash 值。

<template><div id="app"><div class="nav-box"><ul class="f-cb"><li><router-link to="/" exact tag="div"  event="mouseover">home</router-link></li><li><router-link :to="{path:'/document#abc'}" event="mouseover">document</router-link></li><router-link to="/about" tag="li" event="mouseover"><i></i><span>about</span></router-link></ul></div><div class="content f-cb"><router-view name="slider"></router-view> <!-- 命名视图 --><router-view class="center"></router-view></div></div>
</template>

@/components/Document.vue

<template><div>我是文档<p id="abc">定位到这个元素</p></div>
</template>

router/index.js

let router = new VueRouter({mode:'history',//默认是hash模式linkActiveClass:'menvscode-active',scrollBehavior(to,from,savePosition){ // 在点击浏览器的“前进/后退”,或者切换导航的时候触发。console.log(to) // to:要进入的目标路由对象,到哪里去console.log(from) // from:离开的路由对象,哪里来console.log(savePosition) // savePosition:会记录滚动条的坐标,点击前进/后退的时候记录值{x:?,y:?}/*if(savePosition) {return savePosition;}else{return {x:0,y:0}}*/if(to.hash){ //先判断目标路由有没有hash值return {selector:to.hash}}},routes:[]
})
export default router

相关文章:

vueRouter中scrollBehavior实现滚动固定位置

使用前端路由&#xff0c;当切换到新路由时&#xff0c;想要页面滚到顶部&#xff0c;或者是保持原先的滚动位置&#xff0c;就像重新加载页面那样。 vue-router 能做到&#xff0c;而且更好&#xff0c;它让你可以自定义路由切换时页面如何滚动。 注意: 这个功能只在 HTML5 h…...

解决WinForms跨线程操作控件的问题

解决WinForms跨线程操作控件的问题 介绍 在构建Windows窗体应用程序时&#xff0c;我们通常会遇到需要从非UI线程更新UI元素的场景。由于WinForms控件并不是线程安全的&#xff0c;直接这样做会抛出一个异常&#xff1a;“控件’control name’是从其他线程创建的&#xff0c;…...

从零开始:Git 上传与使用指南

Git 是一种非常强大的版本控制系统&#xff0c;它可以帮助您在多人协作开发项目中更好地管理代码版本&#xff0c;并确保每个团队成员都能及时地获取最新的代码更改。在使用 Git 进行版本控制之前&#xff0c;您需要先进行一些设置&#xff0c;以确保您的代码能够顺利地与远程仓…...

Docker compose部署Golang服务

Docker Compose 部署 在使用docker部署时&#xff0c;除了使用--link的方式来关联容器之外&#xff0c;还可以使用 docker compose 运行多个容器。 本文以项目&#xff1a;https://github.com/johncxf/go-api 为例。 定义 Dockerfile 我这里用于区分默认 Dockerfile 文件&a…...

Day36 435无重叠区间 763划分字母区间

435 无重叠区间 给定一个区间的集合&#xff0c;找到需要移除区间的最小数量&#xff0c;使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”&#xff0c;但没有相互重叠。 本题与上一题类似&#xff1a; 如果按照左…...

【Servlet】如何编写第一个Servlet程序

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Servlet】 本专栏旨在分享学习Servlet的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; Servlet是Java编写的服务器端…...

读懂比特币—bitcoin代码分析(五)

今天的代码分析主要是 bitcoin/src/init.cpp 文件中的三个函数&#xff1a;AppInitSanityChecks、AppInitLockDataDirectory、AppInitInterfaces&#xff0c;下面我们来说明这三个函数是用来干什么的&#xff0c;并逐行解读函数代码&#xff0c;先贴出源代码如下&#xff1a; …...

uniapp使用uQRCode插件生成二维码的简单使用

最近在找移动端绘制二维码的问题 &#xff0c;直接上代码 下载 weapp-qrcode.js(可以通过npm install weapp-qrcode --save 下载,之后把它父子到untils目录下&#xff09; npm install weapp-qrcode --save在组件页面使用 <canvas id"couponQrcode" canvas-id&qu…...

【寒假每日一题·2024】AcWing 4965. 三国游戏(补)

文章目录 一、题目1、原题链接2、题目描述 二、解题报告1、思路分析2、时间复杂度3、代码详解 一、题目 1、原题链接 4965. 三国游戏 2、题目描述 二、解题报告 1、思路分析 思路参考y总&#xff1a;y总讲解视频 &#xff08;1&#xff09;题目中的获胜情况分为三种&#xff…...

docker 安装mongodb 数据库

1.拉取mongodb镜像 docker pull mongo2.创建文件夹 mkdir -p /home/mongo/conf/ mkdir -p /home/mongo/data/ mkdir -p /home/mongo/logs/3.新增mongod.conf文件 cd /home/mongo/conf && vi mongod.confmongod.conf文件内容&#xff1a; # 数据库文件存储位置 dbpa…...

整数反转算法(leetcode第7题)

题目描述&#xff1a; 给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] &#xff0c;就返回 0。假设环境不允许存储 64 位整数&#xff08;有符号或无符号&#xff09;。示例 1…...

微信小程序(十)表单组件(入门)

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.type 属性指定表单类型 2.placeholder 属性指定输入框为空时的占位文字 源码&#xff1a; form.wxml <!-- 提前准备好的布局结构代码 --> <view class"register"><view class"…...

xcode 设置 ios苹果图标,为Flutter应用程序配置iOS图标

图标设置 1,根据图片构建各类尺寸的图标2.xcode打开ios文件3.xcode设置图标4.打包提交审核,即可(打包教程可通过我的主页查找) 1,根据图片构建各类尺寸的图标 工具网址:https://icon.wuruihong.com/ 下载之后文件目录如下 拷贝到项目的ios\Runner\Assets.xcassets\AppIcon.ap…...

什么是IDE?新手用哪个IDE比较好?

哈喽大家好&#xff0c;我是咕噜美乐蒂&#xff0c;很高兴又见面啦&#xff01;今天我们来了解一下什么是IDE以及新手应该如何选择IDE比较合适。 一、什么是IDE&#xff1f; IDE&#xff08;Integrated Development Environment&#xff0c;集成开发环境&#xff09;是一种软…...

【数据库学习】pg安装与运维

1&#xff0c;安装与配置 #安装 yum install https:....rpm1&#xff09;安装目录 bin目录&#xff1a;二进制可执行文件目录&#xff0c;此目录下有postgres、psql等可执行程序&#xff1b;pg_ctl工具在此目录&#xff0c;可以通过pg_ctl --help查看具体使用。 conf目录&…...

第二篇【传奇开心果短博文系列】Python的OpenCV库技术点案例示例:图像处理

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例短博文系列 博文目录一、项目目标二、第一个示例代码三、第二个示例代码四、第三个示例代码五、第四个示例代码六、第五个示例代码七、知识点归纳总结 系列短博文目录 Python的OpenCV库技术点案例示例短博文…...

【vue oidc-client】invalid_requestRequest Id: 0HN0OOPFRLSF2:00000002

需求&#xff1a;完成统一登录&#xff0c;需要从三方平台跳到我们的平台。 oidc-client报错记录。这个一般是配置信息出错&#xff0c;需要和三方平台进行沟通&#xff0c;一定要把client_id&#xff0c;密钥进行对应&#xff1b; 同时关于此次出错还修改了以下代码&#xff…...

什么是中间人攻击? ssh 连接出现 Host key verification failed 解决方法

文章目录 前言known_hosts 文件是什么文件路径示例 连接出现 Host key verification failedssh-keygen -R [hostname or ip address]删除整个 known_hosts 文件 其它聊聊中间人攻击ssh 如何保证安全&#xff1f;加密流程漏洞在哪里如何避免中间人攻击 个人简介 前言 最近服务器…...

数据结构系统刷题

本文为系统刷leetcode的记录&#xff0c;会记录自己根据代码随想录刷过的leetcode&#xff0c;方便直接点开刷题&#xff0c;时常更新 时间复杂度简记为s 空间复杂度简记为k 数组 704 二分查找 一维二分查找 &#xff08;1&#xff09;[left, right] class Solution { publi…...

【RabbitMQ】延迟队列之死信交换机

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《RabbitMQ实战》。&#x1f3af;&#x1f3af; &am…...

用移位指令重构跑马灯程序:西门子S7-200PLC的两种经典实现方案对比

西门子S7-200PLC跑马灯程序进阶&#xff1a;移位指令与定时器的架构级对决 在工业自动化现场&#xff0c;跑马灯控制看似基础&#xff0c;却暗藏程序架构设计的精髓。当一位经验丰富的PLC工程师面对产线改造需求时&#xff0c;如何在定时器方案与移位指令方案之间做出技术选型&…...

嵌入式软件开发相关的硬件知识及技能

对于嵌入式软件开发工程师来说&#xff0c;硬件知识并非要求达到硬件工程师那样的设计深度&#xff0c;而是更侧重于理解、交互与协同。掌握必要的硬件知识&#xff0c;能让你写出更稳定、更高效的代码&#xff0c;并在软硬件联调时快速定位问题。以下从几个核心层面详述所需掌…...

极速AI绘图新体验:Qwen-Image 2步Turbo LoRA来了

极速AI绘图新体验&#xff1a;Qwen-Image 2步Turbo LoRA来了 【免费下载链接】Qwen-Image-2512-Turbo-LoRA-2-Steps 项目地址: https://ai.gitcode.com/hf_mirrors/Wuli-art/Qwen-Image-2512-Turbo-LoRA-2-Steps 导语&#xff1a;AI图像生成领域再迎新突破——Wuli团队…...

企业级智能客服系统实战:基于RAG与语义检索的架构设计与避坑指南

最近在做一个企业级智能客服系统的项目&#xff0c;客户对传统客服的响应速度和知识更新效率很不满意。我们团队尝试了多种方案&#xff0c;最终决定采用RAG&#xff08;检索增强生成&#xff09;结合语义检索的技术路线。今天就来分享一下我们的实战经验&#xff0c;特别是架构…...

在LubanCat RK3568上跑通YOLOv5:手把手教你用RKNN-Toolkit-lite2部署目标检测模型

在LubanCat RK3568上部署YOLOv5模型的完整实战指南 1. 边缘计算与目标检测的完美结合 当计算机视觉遇上边缘计算&#xff0c;一场效率革命正在发生。想象一下&#xff0c;在工厂流水线上实时检测产品缺陷&#xff0c;在智慧农场中自动识别病虫害&#xff0c;或是在安防场景下即…...

如何用开源工具实现MobaXterm专业版功能解锁?技术方案与实践指南

如何用开源工具实现MobaXterm专业版功能解锁&#xff1f;技术方案与实践指南 【免费下载链接】MobaXterm-keygen 项目地址: https://gitcode.com/gh_mirrors/moba/MobaXterm-keygen 在远程服务器管理领域&#xff0c;MobaXterm专业版凭借其集成SSH、X11转发、多标签会话…...

EasyExcel导出日期变#####?3分钟搞定列宽自适应问题(附@ColumnWidth注解详解)

EasyExcel导出日期变#####&#xff1f;3分钟搞定列宽自适应问题&#xff08;附ColumnWidth注解详解&#xff09; 当你用EasyExcel导出数据时&#xff0c;突然发现Excel里本该显示日期的单元格变成了一串"#####"&#xff0c;这种场景对Java开发者来说再熟悉不过了。别…...

电商API接口数据采集与应用行业分析

电商 API 接口数据采集与应用行业&#xff0c;已从早期的 “数据获取工具” 升级为电商数字化的核心基础设施&#xff0c;正处于合规化、智能化、全链路整合的高速发展期。2025 年中国电商数据服务市场规模约1800 亿元&#xff0c;年复合增长率25%-30%&#xff1b;全球跨境电商…...

Halcon实战:5分钟搞定特征点拼接图片(附完整代码解析)

Halcon特征点拼接实战&#xff1a;从原理到代码的完整指南 在工业视觉检测、医学影像分析和无人机航拍等领域&#xff0c;图像拼接技术扮演着关键角色。Halcon作为机器视觉领域的标杆工具&#xff0c;其强大的特征点匹配算法让复杂场景下的图像拼接变得简单高效。本文将带您深入…...

揭秘XHS-Downloader:如何实现小红书内容高效采集与无水印下载

揭秘XHS-Downloader&#xff1a;如何实现小红书内容高效采集与无水印下载 【免费下载链接】XHS-Downloader 免费&#xff1b;轻量&#xff1b;开源&#xff0c;基于 AIOHTTP 模块实现的小红书图文/视频作品采集工具 项目地址: https://gitcode.com/gh_mirrors/xh/XHS-Downloa…...