useRouter
useRouter 钩子允许您在 客户端组件 (Client Components) 中以编程方式更改路由。
推荐: 除非有特殊需求需要使用
useRouter,否则请使用<Link>组件 进行导航。
'use client'
import { useRouter } from 'next/navigation'
export default function Page() {
const router = useRouter()
return (
<button type="button" onClick={() => router.push('/dashboard')}>
Dashboard
</button>
)
}'use client'
import { useRouter } from 'next/navigation'
export default function Page() {
const router = useRouter()
return (
<button type="button" onClick={() => router.push('/dashboard')}>
Dashboard
</button>
)
}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>组件在视口中可见时,会自动预加载其路由。- 如果获取请求已被缓存,
refresh()可能会产生相同的结果。其他动态函数如cookies和headers也可能会改变响应。
从 next/router 迁移
- 使用应用路由 (App Router) 时,
useRouter钩子应从next/navigation导入,而非next/router pathname字符串已被移除,替换为usePathname()query对象已被移除,替换为useSearchParams()router.events已被替换。详见下文
示例
路由事件
您可以通过组合其他客户端组件钩子如 usePathname 和 useSearchParams 来监听页面变化。
'use client'
import { useEffect } from 'react'
import { usePathname, useSearchParams } from 'next/navigation'
export function NavigationEvents() {
const pathname = usePathname()
const searchParams = useSearchParams()
useEffect(() => {
const url = `${pathname}?${searchParams}`
console.log(url)
// 您现在可以使用当前 URL
// ...
}, [pathname, searchParams])
return null
}然后可以将其导入布局中。
import { Suspense } from 'react'
import { NavigationEvents } from './components/navigation-events'
export default function Layout({ children }) {
return (
<html lang="en">
<body>
{children}
<Suspense fallback={null}>
<NavigationEvents />
</Suspense>
</body>
</html>
)
}须知:
<NavigationEvents>被包裹在Suspense边界 中,因为在 静态渲染 (static rendering) 期间,useSearchParams()会导致客户端渲染直至最近的Suspense边界。了解更多。
禁用滚动恢复
默认情况下,Next.js 在导航至新路由时会滚动至页面顶部。您可以通过向 router.push() 或 router.replace() 传递 scroll: false 来禁用此行为。
'use client'
import { useRouter } from 'next/navigation'
export default function Page() {
const router = useRouter()
return (
<button
type="button"
onClick={() => router.push('/dashboard', { scroll: false })}
>
Dashboard
</button>
)
}'use client'
import { useRouter } from 'next/navigation'
export default function Page() {
const router = useRouter()
return (
<button
type="button"
onClick={() => router.push('/dashboard', { scroll: false })}
>
Dashboard
</button>
)
}版本历史
| 版本 | 变更描述 |
|---|---|
v13.0.0 | 引入了来自 next/navigation 的 useRouter。 |