You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Next.js路由跳转时保留共享组件之前滚动位置的问题

Next.js路由跳转后自动回顶修复方案

问题原因

Next.js默认会在客户端路由跳转时保留当前页面的滚动位置,因此你在页面底部跳转到新路由时,会继承之前的滚动高度,直接显示在页面底部位置。

修复方案

方案1:全局配置(通用推荐,所有路由跳转都生效)

Pages Router版本(项目有pages目录的情况)

修改pages/_app.js文件,添加路由跳转监听事件,每次路由跳转完成后自动滚动到顶部:

import { useEffect } from 'react'
import { useRouter } from 'next/router'

function MyApp({ Component, pageProps }) {
  const router = useRouter()

  useEffect(() => {
    // 路由跳转完成后触发的回调
    const handleRouteChange = () => {
      window.scrollTo(0, 0)
      // 如果你用了GSAP ScrollTrigger,建议加这行避免滚动动画异常
      // ScrollTrigger.refresh()
    }
    // 绑定路由监听事件
    router.events.on('routeChangeComplete', handleRouteChange)
    // 组件卸载时解绑事件,避免内存泄漏
    return () => {
      router.events.off('routeChangeComplete', handleRouteChange)
    }
  }, [router.events])

  return <Component {...pageProps} />
}

export default MyApp

App Router版本(项目有app目录的情况)

修改app/layout.js根布局文件,监听路径变化自动滚动到顶部:

'use client'
import { useEffect } from 'react'
import { usePathname } from 'next/navigation'

export default function RootLayout({ children }) {
  const pathname = usePathname()

  useEffect(() => {
    window.scrollTo(0, 0)
    // GSAP ScrollTrigger修复逻辑同上
    // ScrollTrigger.refresh()
  }, [pathname])

  return (
    <html lang="zh-CN">
      <body>{children}</body>
    </html>
  )
}

方案2:单链接配置(仅指定链接跳转时回顶)

如果不需要所有跳转都回顶,只需要联系我们的链接跳转时回顶,将原有原生a标签替换为Next.js内置的Link组件,开启滚动重置属性即可:

// 先引入Link组件
import Link from 'next/link'

// 替换原有联系我们跳转代码
<Link href="/你的联系我们页面路径" scroll={true}>
  联系我们
</Link>

注意:Next.js 13+版本的Link组件默认已经开启scroll={true},低版本需要手动添加该属性

额外建议

站内路由跳转不要使用原生a标签,原生a标签会触发整页刷新,性能远低于Next.js的Link组件客户端路由跳转逻辑。

内容的提问来源于stack exchange,提问作者Sathish Battula

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 00:54:01