mirror of
https://github.com/hanzoai/next.js.git
synced 2026-09-24 17:00:51 +00:00
- Add **Going to Prod** docs for `app` - Add bundle-analyzer page - Merge `app` and `pages` docs --------- Co-authored-by: Delba de Oliveira <[email protected]> Co-authored-by: Tim Neutkens <[email protected]> Co-authored-by: Michael Novotny <[email protected]> Co-authored-by: Delba de Oliveira <[email protected]> Co-authored-by: Rich Haines <[email protected]> Co-authored-by: Lee Robinson <[email protected]>
162 lines
5.6 KiB
Plaintext
162 lines
5.6 KiB
Plaintext
---
|
||
title: useRouter
|
||
description: API reference for the useRouter hook.
|
||
---
|
||
|
||
The `useRouter` hook allows you to programmatically change routes inside [Client Components](/docs/app/building-your-application/rendering/client-components).
|
||
|
||
> **Recommendation:** Use the [`<Link>` component](/docs/app/building-your-application/routing/linking-and-navigating#link-component) for navigation unless you have a specific requirement for using `useRouter`.
|
||
|
||
```tsx filename="app/example-client-component.tsx" switcher
|
||
'use client'
|
||
|
||
import { useRouter } from 'next/navigation'
|
||
|
||
export default function Page() {
|
||
const router = useRouter()
|
||
|
||
return (
|
||
<button type="button" onClick={() => router.push('/dashboard')}>
|
||
Dashboard
|
||
</button>
|
||
)
|
||
}
|
||
```
|
||
|
||
```jsx filename="app/example-client-component.js" switcher
|
||
'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 })`: Perform a client-side navigation to the provided route. Adds a new entry into the [browser’s history](https://developer.mozilla.org/docs/Web/API/History_API) stack.
|
||
- `router.replace(href: string, { scroll: boolean })`: Perform a client-side navigation to the provided route without adding a new entry into the [browser’s history stack](https://developer.mozilla.org/docs/Web/API/History_API).
|
||
- `router.refresh()`: Refresh the current route. Making a new request to the server, re-fetching data requests, and re-rendering Server Components. The client will merge the updated React Server Component payload without losing unaffected client-side React (e.g. `useState`) or browser state (e.g. scroll position).
|
||
- `router.prefetch(href: string)`: [Prefetch](/docs/app/building-your-application/routing/linking-and-navigating#2-prefetching) the provided route for faster client-side transitions.
|
||
- `router.back()`: Navigate back to the previous route in the browser’s history stack.
|
||
- `router.forward()`: Navigate forwards to the next page in the browser’s history stack.
|
||
|
||
> **Good to know**:
|
||
>
|
||
> - The `<Link>` component automatically prefetch routes as they become visible in the viewport.
|
||
> - `refresh()` could re-produce the same result if fetch requests are cached. Other dynamic functions like `cookies` and `headers` could also change the response.
|
||
|
||
### Migrating from `next/router`
|
||
|
||
- The `useRouter` hook should be imported from `next/navigation` and not `next/router` when using the App Router
|
||
- The `pathname` string has been removed and is replaced by [`usePathname()`](/docs/app/api-reference/functions/use-pathname)
|
||
- The `query` object has been removed and is replaced by [`useSearchParams()`](/docs/app/api-reference/functions/use-search-params)
|
||
- `router.events` has been replaced. [See below.](#router-events)
|
||
|
||
[View the full migration guide](/docs/app/building-your-application/upgrading/app-router-migration).
|
||
|
||
## Examples
|
||
|
||
### Router events
|
||
|
||
You can listen for page changes by composing other Client Component hooks like `usePathname` and `useSearchParams`.
|
||
|
||
```jsx filename="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 null
|
||
}
|
||
```
|
||
|
||
Which can be imported into a layout.
|
||
|
||
```jsx filename="app/layout.js" highlight={2,10-12}
|
||
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>
|
||
)
|
||
}
|
||
```
|
||
|
||
> **Good to know**: `<NavigationEvents>` is wrapped in a [`Suspense` boundary](/docs/app/building-your-application/routing/loading-ui-and-streaming#example) because[`useSearchParams()`](/docs/app/api-reference/functions/use-search-params) causes client-side rendering up to the closest `Suspense` boundary during [static rendering](/docs/app/building-your-application/rendering/server-components#static-rendering-default). [Learn more](/docs/app/api-reference/functions/use-search-params#behavior).
|
||
|
||
### Disabling scroll restoration
|
||
|
||
By default, Next.js will scroll to the top of the page when navigating to a new route. You can disable this behavior by passing `scroll: false` to `router.push()` or `router.replace()`.
|
||
|
||
```tsx filename="app/example-client-component.tsx" switcher
|
||
'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>
|
||
)
|
||
}
|
||
```
|
||
|
||
```jsx filename="app/example-client-component.jsx" switcher
|
||
'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>
|
||
)
|
||
}
|
||
```
|
||
|
||
## Version History
|
||
|
||
| Version | Changes |
|
||
| --------- | ---------------------------------------------- |
|
||
| `v13.0.0` | `useRouter` from `next/navigation` introduced. |
|