useRouter
useRouter
钩子允许您在客户端组件中以编程方式更改路由。
建议:除非您有使用
useRouter
的特定需求,否则请使用<Link>
组件进行导航。
app/example-client-component.tsx
'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 })
:执行客户端导航到提供的路由。在浏览器历史记录堆栈中添加新条目。router.replace(href: string, { scroll: boolean })
:执行客户端导航到提供的路由,但不会在浏览器历史记录堆栈中添加新条目。router.refresh()
:刷新当前路由。向服务器发出新请求,重新获取数据请求并重新渲染服务器组件。客户端将合并更新的 React 服务器组件有效负载,而不会丢失未受影响的客户端 React(例如useState
)或浏览器状态(例如滚动位置)。router.prefetch(href: string)
:预取提供的路由,以实现更快的客户端转换。router.back()
:导航回浏览器历史记录堆栈中的上一条路由。router.forward()
:导航到浏览器历史记录堆栈中的下一页。
需要了解:
<Link>
组件会自动预取在视口中可见的路由。- 如果获取请求被缓存,则
refresh()
可能产生相同的结果。其他动态 API(如cookies
和headers
)也可能更改响应。
从 next/router
迁移
- 使用 App 路由器时,应从
next/navigation
而不是next/router
导入useRouter
钩子。 pathname
字符串已被移除,并由usePathname()
取代。query
对象已被移除,并由useSearchParams()
取代。router.events
已被替换。 请参见下文。
示例
路由事件
您可以通过组合其他客户端组件钩子(如 usePathname
和 useSearchParams
)来监听页面更改。
app/components/navigation-events.js
'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)
// You can now use the current URL
// ...
}, [pathname, searchParams])
return '...'
}
可以将其导入布局中。
app/layout.js
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
边界 内,因为useSearchParams()
在 静态渲染 期间会导致客户端渲染到最近的Suspense
边界。 了解更多。
禁用滚动到顶部
默认情况下,Next.js 在导航到新路由时会滚动到页面顶部。您可以通过将 scroll: false
传递给 router.push()
或 router.replace()
来禁用此行为。
app/example-client-component.tsx
'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 。 |
这有帮助吗?