Vue3 页面切换 / 刷新后恢复滚动位置的实现方案(超精简)

一、需求背景

在 Vue3 前端项目中,当用户在长列表 / 长内容页面滚动浏览后,切换到其他页面再返回,或刷新当前页面时,滚动条会默认回到顶部,用户需要重新滚动到之前的位置,体验较差。本文将分享一种基于 ref 引用 + 本地存储的方案,实现滚动位置的记忆与恢复。

二、核心实现思路

  1. 通过 ref 获取滚动容器的 DOM 元素,精准控制滚动行为;
  2. 监听滚动容器的滚动事件,实时记录滚动高度并存储到本地
  3. 页面初始化 / 请求数据完成后,通过 nextTick 确保 DOM 渲染完成,从本地存储读取滚动高度并恢复;
  4. 页面销毁前统一清理无用的本地存储,避免冗余数据。

三、具体实现方式

template部分

js 复制代码
<div class="content-wrapper" ref="scrollRef">
    //这里写你滚动的内容
    //也就是滚动条滚动的位置
</div>

js部分

定义相关参数

ts 复制代码
// 滚动容器引用
const scrollRef = ref<any | null>(null);
// 记录离开页面时的滚动高度
const scrollHeight = ref(0);
//定义本地储存的滚动条相关高度的名字
const STORAGE_PROJECT_HEIGHT = 'project_height';

在你页面数据请求完成后加上异步执行获取本地储存的实例滚动高度,这样请求完数据后让滚动条自动跳转到上次离开时的滚动位置

ts 复制代码
nextTick(() => {
  if (scrollRef.value) {
    //这里已经封装好了Storage,如果没封装可以用原生的localStorage.setItem(KEY, JSON.stringify(数据))
    const a: number = Storage.get(STORAGE_PROJECT_HEIGHT)?.height
    scrollRef.value.scrollTop = a
  }
})

在离开前一个页面时执行并且把实例滚动高度储存到本地

js 复制代码
onBeforeRouteLeave((to, from, next) => {
  if (scrollRef.value) {
    const scrollDom = scrollRef.value;
    const currentScrollTop = scrollDom.scrollTop;//获取当前滚动高度
    // 仅保存有效数值
    if (!isNaN(currentScrollTop) && currentScrollTop >= 0) {
      scrollHeight.value = currentScrollTop;
      Storage.set(STORAGE_PROJECT_HEIGHT, {
        height: currentScrollTop
      });
    }
  }
  next();
});
相关推荐
To_OC11 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
咩咩啃树皮12 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
阳光是sunny12 小时前
LangGraph中的Reducer是什么
前端·人工智能·后端
触底反弹12 小时前
一文搞懂 Tailwind CSS 弹性布局:从原理到实战
前端·css·html
阳光是sunny12 小时前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
To_OC13 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
小林ixn13 小时前
从 ??= 到 onKeyDown:一个 React 组件的“自我修养”
前端·javascript·react.js
REDcker13 小时前
显示分辨率标准对照详解
前端·网络·分辨率·显示·屏幕
এ慕ོ冬℘゜14 小时前
前端实战:jQuery 多条件联合搜索(标题模糊查询 + 日历时间段筛选)
前端·javascript·jquery
武子康14 小时前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端