useRouter
useRouter
hook 允许你在客户端组件中以编程方式更改路由。
建议:除非你有使用
useRouter
的特定需求,否则请使用<Link>
组件进行导航。
useRouter()
router.push(href: string, { scroll: boolean })
:执行客户端导航到指定路由。在浏览器的历史记录栈中添加一个新条目。router.replace(href: string, { scroll: boolean })
:执行客户端导航到指定路由,但不在浏览器的历史记录栈中添加新条目。router.refresh()
:刷新当前路由。向服务器发出新请求,重新获取数据请求,并重新渲染服务器组件。客户端将合并更新后的 React 服务器组件载荷,而不会丢失未受影响的客户端 React 状态(如useState
)或浏览器状态(如滚动位置)。router.prefetch(href: string)
:预加载指定路由以实现更快的客户端跳转。router.back()
:导航到浏览器历史记录栈中的上一个路由。router.forward()
:导航到浏览器历史记录栈中的下一个页面。
值得注意的是:
<Link>
组件会在路由进入视口时自动预加载。- 如果 fetch 请求被缓存,
refresh()
可能会产生相同的结果。其他动态 API(如cookies
和headers
)也可能改变响应。
从 next/router
迁移
- 在使用 App Router 时,
useRouter
hook 应从next/navigation
而不是next/router
导入 pathname
字符串已被移除,由usePathname()
替代query
对象已被移除,由useSearchParams()
替代router.events
已被替换。见下文。
示例
Router 事件
你可以通过组合其他客户端组件 hook(如 usePathname
和 useSearchParams
)来监听页面变化。
可以将其导入到布局中。
值得注意的是:
<NavigationEvents>
被包裹在Suspense
边界中,因为在静态渲染期间,useSearchParams()
会导致客户端渲染直到最近的Suspense
边界。了解更多。
禁用滚动到顶部
默认情况下,Next.js 在导航到新路由时会滚动到页面顶部。你可以通过向 router.push()
或 router.replace()
传递 scroll: false
来禁用此行为。
版本历史
版本 | 更改 |
---|---|
v13.0.0 | 引入来自 next/navigation 的 useRouter 。 |