useRouter
El hook useRouter
permite cambiar rutas programáticamente dentro de Componentes del Cliente.
Recomendación: Utilice el componente
<Link>
para navegación a menos que tenga un requisito específico para usaruseRouter
.
'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 })
: Realiza una navegación del lado del cliente a la ruta proporcionada. Añade una nueva entrada en la pila de historial del navegador.router.replace(href: string, { scroll: boolean })
: Realiza una navegación del lado del cliente a la ruta proporcionada sin añadir una nueva entrada en la pila de historial del navegador.router.refresh()
: Actualiza la ruta actual. Hace una nueva solicitud al servidor, vuelve a obtener solicitudes de datos y vuelve a renderizar Componentes del Servidor. El cliente fusionará la carga útil actualizada del Componente del Servidor de React sin perder el estado del lado del cliente de React (ej.useState
) o el estado del navegador (ej. posición de desplazamiento).router.prefetch(href: string)
: Prefetch la ruta proporcionada para transiciones más rápidas del lado del cliente.router.back()
: Navega hacia atrás a la ruta anterior en la pila de historial del navegador.router.forward()
: Navega hacia adelante a la siguiente página en la pila de historial del navegador.
Importante:
- No debe enviar URLs no confiables o no sanitizadas a
router.push
orouter.replace
, ya que esto puede exponer su sitio a vulnerabilidades de cross-site scripting (XSS). Por ejemplo, URLs conjavascript:
enviadas arouter.push
orouter.replace
se ejecutarán en el contexto de su página.- El componente
<Link>
hace prefetch automáticamente de rutas cuando se vuelven visibles en el viewport.refresh()
podría reproducir el mismo resultado si las solicitudes fetch están en caché. Otras APIs dinámicas comocookies
yheaders
también podrían cambiar la respuesta.
Migración desde next/router
- El hook
useRouter
debe importarse desdenext/navigation
y no desdenext/router
cuando se usa el App Router - El string
pathname
ha sido eliminado y reemplazado porusePathname()
- El objeto
query
ha sido eliminado y reemplazado poruseSearchParams()
router.events
ha sido reemplazado. Ver más abajo.
Ver la guía completa de migración.
Ejemplos
Eventos del Router
Puede escuchar cambios de página componiendo otros hooks de Componentes del Cliente como usePathname
y 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)
// Ahora puede usar la URL actual
// ...
}, [pathname, searchParams])
return '...'
}
Que puede importarse en un layout.
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>
)
}
Importante:
<NavigationEvents>
está envuelto en un límiteSuspense
porqueuseSearchParams()
causa renderizado del lado del cliente hasta el límiteSuspense
más cercano durante renderizado estático. Aprender más.
Deshabilitar desplazamiento al inicio
Por defecto, Next.js se desplazará al inicio de la página al navegar a una nueva ruta. Puede deshabilitar este comportamiento pasando scroll: false
a router.push()
o router.replace()
.
'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>
)
}
Historial de versiones
Versión | Cambios |
---|---|
v13.0.0 | Se introdujo useRouter desde next/navigation . |