vue3+ts实现页面滚动位置的保存及恢复

news/2025/11/12 17:19:42/文章来源:https://www.cnblogs.com/xyyt/p/19214673

vue3+ts实现页面滚动位置的保存及恢复

前言:

折腾了n个小时才搞定,这个在vue2中不显眼的功能到了vue3中没想到成为了拦路虎。借助于AI一遍一遍的尝试各种方案,最终敲定了路由scrollBehavior保存组件滚动位置到pinia,页面的onActivated中读取滚动位置并进行恢复。

关键代码:

1. 编写store保存页面滚动位置:

scrollStore.ts

import { defineStore, createPinia } from "pinia";
import piniaPluginPersistedstate from "pinia-plugin-persistedstate";// 第一步:创建 Pinia 实例
const pinia = createPinia();
// 第二步:注册持久化插件(必须在定义 Store 之前)
pinia.use(piniaPluginPersistedstate);
// 第三步:导出pinia
export default pinia;//页面滚动状态保持
export const useScrollStore = defineStore("scrollStore", {state: () => {return {scrollTop: 0,};},//数据持久化配置
  persist: {storage: sessionStorage,},actions: {updateScrollTop(data) {console.log(data);this.scrollTop = data;},},
});

2. 使用scrollBehavior保存滚动位置到store中:

router.ts

import { createRouter, createWebHashHistory } from "vue-router";
import { useScrollStore } from "@/store/index";const routerHash = createWebHashHistory();const router = createRouter({history: routerHash,routes: [{path: "/",name: "Home",meta: {keepAlive: true,saveScroll: true,},component: () => import("@/views/Home.vue"),},{path: "/:w+",name: "Error",meta: {title: "访问错误",},component: () => import("@/views/Error.vue"),},], // 关键:覆盖默认滚动行为,阻止路由切换时自动滚顶scrollBehavior: (to, from, savedPosition) => {// 1. 若从需要保存滚动的页面(from.meta.saveScroll)跳转,优先恢复滚动if (to.meta.saveScroll) {const scrollStore = useScrollStore();const savedTop = scrollStore.scrollTop;if (savedTop > 0) {// 用 nextTick 确保 DOM 已渲染,比 setTimeout(0) 更快return nextTick().then(() => {const container = document.getElementById("container");if (container) {return {el: "#container", // 指定滚动容器top: savedTop, // 恢复到保存的位置behavior: "smooth", // 默认为瞬间滚动(无动画,避免闪动)
            };}});}}// 2. 其他页面默认滚顶(可根据需求调整)return { top: 0 };},
});
export default router;

3. 页面引入:
需要保持页面滚动位置的页面只需引入 useScroll,无需额外代码

<template><div id="container"><!--页面内容--></div>
</template><script setup lang="ts">import { useScroll} from '@/store/useScroll'useScroll()</script><style lang="scss" scoped>#container {height: calc(100vh - 100px);overflow-y: scroll;}
</style>

如上,即可实现页面滚动位置保存及恢复功能,实测有效,如果遇到没生效的可以留言代码交流。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SAP屏幕增强自定义界面字段使用自定义搜索帮助方法

背景:在比如采购订单、销售订单屏幕界面,做了自定义字段,里面要选择一些底表的数据显示。 1、直接使用系统标准的搜索帮助。 假设我们已经有底表数据ZTCMS002,SE11建立搜索帮助. 进到屏幕界面,点击布局 双击字段,…

南大-操作系统-绿导师原谅你了

现在在看的视频: 操作系统上的程序 (什么是程序和编译器) [南京大学2022操作系统-P2] 1. 缘起 事情起因是在学习youtube上benEater的制作cpu的视频,然后在b站上搜索有没有人做过搬运或者中文翻译的视频。 B站搜索后找…

昌都西林瓶粉末灌装机:远程可控,手机电脑轻松操作

在制药、生物试剂及精细化工等行业,西林瓶灌装设备的选型常面临多重挑战:一方面,用户对灌装精度、洁净等级、自动化程度等核心参数理解不足;另一方面,市场产品种类繁杂,功能描述模糊,导致需求与设备实际能力错配…

深入解析:EI会议预订又又+1

深入解析:EI会议预订又又+12025-11-12 17:07 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important;…

牛B, 我去,新手小白也能使用InfiniteTalk搭建属于自己的数字人啦 ,真的太简单啦!!!

嗨,我是小华同学,专注解锁高效工作与前沿AI工具!每日精选开源技术、实战技巧,助你省时50%、领先他人一步。👉免费订阅,与10万+技术人共享升级秘籍!数字人视频制作最难的是两点:口型要准、全身/表情要自然一致…

QCombox判断是否包含某项

在 Qt 中,判断 QComboBox 是否包含某项有几种方法。以下是详细的解决方案: 方法一:使用 findText() 函数(最常用) #include <QComboBox>// 判断是否包含文本项 QComboBox *comboBox = new QComboBox(this);…

植物大战僵尸2下载教程:延续经典塔防,体验全新时空冒险

前言: 十多年前,一款小巧却极具创意的塔防游戏——《植物大战僵尸》,几乎成为每一代电脑玩家的共同记忆。它以简洁画风、紧凑节奏和独特策略设计,奠定了塔防类游戏的经典地位。 如今,这个系列迎来了更具规模和深度…

阳江西林瓶灌装加塞机:多品牌如何选?看这几点

在当前制药与生物制剂设备采购市场中,阳江地区的中小型药企及科研机构对西林瓶灌装设备的需求持续增长。据2024年行业调研数据显示,用户在选购西林瓶灌装机时,核心关注点依次为:设备稳定性(占比38%)、灌装精度(…

JavaWeb05-Web基础

JavaWeb05-Web基础Web基础1.SpringBoot Spring官网:spring.ioSpring发展到今天已经形成了一种开发生态圈,Spring提供了若干个子项目,每个项目用于完成特定的功能。Spring Boot可以帮助我们非常快速的构建应用程序、…

CF125E MST Company

按照和 P2619 一样的方法,将连有 \(1\) 的边看作白边,其他边为黑边,随便 WQS 二分一下即可。

Git分支合并

在开发中,我们需要独立的分支进行独立开发,开发测试完之后没问题,往master合并的操作 Git分支合并(别的分支合并到master)bash # 切换到 master 分支 git checkout master# 从远程拉取最新的 master 分支代码(如…

西林瓶灌装机质

在制药、生物试剂及精细化工等行业,设备选型常面临需求与产品错配、技术参数混乱、售后响应滞后等核心痛点。尤其针对西林瓶灌装机这类高精度设备,一旦出现质量问题,不仅影响生产效率,更可能造成整批产品报废。因此…

基于Newmark-β法的单自由度体系地震响应MATLAB实现

基于Newmark-β法的单自由度体系地震响应MATLAB实现一、算法原理与公式 单自由度体系运动方程:Newmark-β法递推公式:预测步:校正步:二、MATLAB核心代码实现 function [time, disp, vel, acc] = Newmark_SDOF(m, c…

无监督学习驱动的遗留系统重构专业的方法论

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Cortex-M3 内核 MCU-STM32F1 构建之路:(一)单片机 MCU 的构成,包括 FLASH 和 SRAM 的区别,以及引脚类型

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

证书的格式转化

Windows server 颁发给Linux的证书一般为p7b格式 流程图:在centos8中把p7b证书转发成pem格式的证书 假设p7b证书在/etc/ssl/certs中 证书的名字: certnew.ceropenssl pkcs7 -inform der -in /etc/ssl/ce…

P14480 化作彗星 题解

Description 为了再现那日的彗星,Nana 和 Lily 需要使用特定的数对把一个序列变成另一个序列。 Nana 有一个长度为 \(n\) 序列 \(a\),Lily 每次可以选择一个下标 \(i(1\le i<n)\),然后操作 \(a_i\leftarrow x,a_…

PG系列:Select查询一样会被阻塞

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。在之前的理解…

物理光学中光束传输与变换的数值模拟研究

物理光学中光束传输与变换的数值模拟方法,包括各种光束模型、传输方程和变换器件的MATLAB实现。 光束传输理论基础 1. 标量波动方程 从麦克斯韦方程组出发,得到亥姆霍兹方程: \(∇E + kE = 0\) 其中 \(k = 2π/λ\)…

Oracle升级回退:10.2.0.4 crs升级到11.2.0.4 回退方案

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。Oracle升级回…