useRouter
useRouter
钩子允许您在 客户端组件 (Client Components) 中以编程方式更改路由。
推荐: 除非有特定需求需要使用
useRouter
,否则请优先使用<Link>
组件 进行导航。
useRouter()
router.push(href: string, { scroll: boolean })
: 执行客户端导航至指定路由。会在 浏览器历史记录 (browser’s history) 栈中添加新条目。router.replace(href: string, { scroll: boolean })
: 执行客户端导航至指定路由,但不会在 浏览器历史记录栈 (browser’s history stack) 中添加新条目。router.refresh()
: 刷新当前路由。会向服务器发起新请求,重新获取数据并重新渲染服务端组件 (Server Components)。客户端会合并更新后的 React 服务端组件负载,同时保留不受影响的客户端 React 状态(如useState
)和浏览器状态(如滚动位置)。router.prefetch(href: string)
: 预取 (Prefetch) 指定路由以实现更快的客户端跳转。router.back()
: 导航至浏览器历史记录栈中的前一个路由。router.forward()
: 导航至浏览器历史记录栈中的下一个页面。
须知:
- 当
<Link>
组件在视口中可见时,会自动预取路由。- 如果 fetch 请求被缓存,
refresh()
可能会产生相同的结果。其他动态函数如cookies
和headers
也可能改变响应。
从 next/router
迁移
- 使用 App Router 时,
useRouter
钩子应从next/navigation
导入,而非next/router
pathname
字符串已被移除,替换为usePathname()
query
对象已被移除,替换为useSearchParams()
router.events
已被替代。详见下文
示例
路由事件
您可以通过组合其他客户端组件钩子(如 usePathname
和 useSearchParams
)来监听页面变化。
该组件可被导入布局文件中。
须知: 由于
useSearchParams()
在静态渲染 (static rendering) 期间会触发客户端渲染直至最近的Suspense
边界,因此<NavigationEvents>
被包裹在 Suspense 边界内。了解更多。
禁用滚动恢复
默认情况下,Next.js 在导航至新路由时会滚动至页面顶部。您可以通过向 router.push()
或 router.replace()
传递 scroll: false
来禁用此行为。
版本历史
版本 | 变更描述 |
---|---|
v13.0.0 | 从 next/navigation 引入 useRouter 钩子。 |