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

React Router DOM v6中ScrollRestoration失效问题及解决方法

React Router v6 <ScrollRestoration> 不生效的问题排查与解决

问题描述

我已按照RRDv6文档的推荐创建了路由:

export const router = createBrowserRouter([
    {
        path: '/',
        element: <Base />,
        children: [
            {
                index: 'true',
                element: <Home />
            },
            {
                path: 'about',
                element: <About/>
            },
            {
                path: 'contato',
                element: <Contact />
            },
            {
                path: '*',
                element: <Error404 />
            }
        ]
    }
])

在App.jsx中添加了<ScrollRestoration>但未生效:

export default function App() {
    return (
        <DataProvider>
            <RouterProvider router={router}>
                <ScrollRestoration />
            </RouterProvider>
        </DataProvider>
    )
}

目前使用scrollToTop方案,但认为这并非最优实现,想知道哪里操作有误,以及如何实现路由切换时的滚动恢复。

问题原因及解决方法

1. <ScrollRestoration> 放置位置错误

<RouterProvider> 仅接受 router 属性,不会渲染它的子节点。你把 <ScrollRestoration> 放在 <RouterProvider> 内部作为子元素,它根本不会被渲染到页面中,自然无法生效。

正确做法是将 <ScrollRestoration> 放到根路由组件 <Base /> 中,确保它处于路由渲染的元素树内部:

// Base.jsx
import { Outlet, ScrollRestoration } from 'react-router-dom';

export default function Base() {
  return (
    <div className="base-container">
      {/* 这里是Base组件的固定内容,比如导航栏、页脚等 */}
      <Outlet /> {/* 渲染子路由内容 */}
      <ScrollRestoration /> {/* 放在路由内容的同级位置 */}
    </div>
  );
}

2. 路由配置的 index 属性类型错误

你配置的 index: 'true' 是字符串类型,React Router 要求 index 必须是布尔值,虽然这个错误不会直接导致滚动恢复失效,但会影响路由匹配的正确性,建议修正:

export const router = createBrowserRouter([
    {
        path: '/',
        element: <Base />,
        children: [
            {
                index: true, // 改为布尔值
                element: <Home />
            },
            // 其他路由保持不变
        ]
    }
])

3. 滚动恢复的额外说明

  • 修正后,<ScrollRestoration> 会自动处理两种场景:导航到新路由时滚动到顶部,返回上一页时恢复之前的滚动位置,完全替代手动的 scrollToTop 方案。
  • 如果需要自定义滚动行为,可以给 <ScrollRestoration> 传入 getKey 属性,指定哪些路由需要保持滚动位置,或者通过 shouldRestoreScroll 自定义恢复逻辑。

内容的提问来源于stack exchange,提问作者Renan Santos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 13:37:38