Link
<Link>
es un componente de React que extiende el elemento HTML <a>
para proporcionar prefetching y navegación del lado del cliente entre rutas. Es la forma principal de navegar entre rutas en Next.js.
Uso básico:
Referencia
Las siguientes props pueden pasarse al componente <Link>
:
Prop | Ejemplo | Tipo | Requerido |
---|---|---|---|
href | href="/dashboard" | String u Objeto | Sí |
replace | replace={false} | Booleano | - |
scroll | scroll={false} | Booleano | - |
prefetch | prefetch={false} | Booleano | - |
legacyBehavior | legacyBehavior={true} | Booleano | - |
passHref | passHref={true} | Booleano | - |
shallow | shallow={false} | Booleano | - |
locale | locale="fr" | String o Booleano | - |
onNavigate | onNavigate={(e) => {}} | Función | - |
Bueno saber: Los atributos de la etiqueta
<a>
comoclassName
otarget="_blank"
pueden agregarse a<Link>
como props y se pasarán al elemento<a>
subyacente.
href
(requerido)
La ruta o URL a la que navegar.
replace
Por defecto es false
. Cuando es true
, next/link
reemplazará el estado actual del historial en lugar de agregar una nueva URL a la pila del historial del navegador.
scroll
Por defecto es true
. El comportamiento de desplazamiento predeterminado de <Link>
en Next.js es mantener la posición de desplazamiento, similar a cómo los navegadores manejan la navegación hacia atrás y adelante. Cuando navegas a una nueva Página, la posición de desplazamiento se mantendrá igual siempre que la Página sea visible en el viewport. Sin embargo, si la Página no es visible en el viewport, Next.js se desplazará hasta la parte superior del primer elemento de la Página.
Cuando scroll = {false}
, Next.js no intentará desplazarse al primer elemento de la Página.
Bueno saber: Next.js verifica si
scroll: false
antes de gestionar el comportamiento de desplazamiento. Si el desplazamiento está habilitado, identifica el nodo DOM relevante para la navegación e inspecciona cada elemento de nivel superior. Se omiten todos los elementos no desplazables y aquellos sin HTML renderizado, esto incluye elementos con posición fija o sticky, y elementos no visibles como los calculados congetBoundingClientRect
. Next.js continúa a través de los elementos hermanos hasta identificar un elemento desplazable que sea visible en el viewport.
prefetch
El prefetching ocurre cuando un componente <Link />
entra en el viewport del usuario (inicialmente o mediante desplazamiento). Next.js precarga y carga la ruta vinculada (indicada por el href
) y los datos en segundo plano para mejorar el rendimiento de las navegaciones del lado del cliente. El prefetching solo está habilitado en producción.
Los siguientes valores pueden pasarse a la prop prefetch
:
true
(predeterminado): Se precargará toda la ruta y sus datos.false
: El prefetching no ocurrirá al entrar en el viewport, pero sí al pasar el cursor. Si deseas eliminar completamente el prefetching al pasar el cursor, considera usar una etiqueta<a>
o adoptar incrementalmente el App Router, que permite deshabilitar el prefetching al pasar el cursor.
legacyBehavior
Advertencia: La prop
legacyBehavior
se eliminará en Next.js v16. Para adoptar el nuevo comportamiento de<Link>
, elimina cualquier etiqueta<a>
usada como hijo de<Link>
. Hay un codemod disponible para ayudarte a actualizar automáticamente tu código base.
Desde la versión 13, un elemento <a>
ya no es necesario como hijo del componente <Link>
. Si aún necesitas el comportamiento antiguo por razones de compatibilidad, puedes agregar la prop legacyBehavior
.
Bueno saber: cuando
legacyBehavior
no está establecido entrue
, todas las propiedades de la etiquetaanchor
pueden pasarse anext/link
, comoclassName
,onClick
, etc.
passHref
Fuerza a Link
a enviar la propiedad href
a su hijo. Por defecto es false
. Consulta el ejemplo de pasar un componente funcional para más información.
shallow
Actualiza la ruta de la página actual sin volver a ejecutar getStaticProps
, getServerSideProps
o getInitialProps
. Por defecto es false
.
locale
La configuración regional activa se agrega automáticamente. locale
permite proporcionar una configuración regional diferente. Cuando es false
, href
debe incluir la configuración regional ya que el comportamiento predeterminado está deshabilitado.
onNavigate
Un manejador de eventos que se llama durante la navegación del lado del cliente. El manejador recibe un objeto de evento que incluye un método preventDefault()
, permitiéndote cancelar la navegación si es necesario.
Bueno saber: Aunque
onClick
yonNavigate
pueden parecer similares, sirven para diferentes propósitos.onClick
se ejecuta para todos los eventos de clic, mientras queonNavigate
solo se ejecuta durante la navegación del lado del cliente. Algunas diferencias clave:
- Al usar teclas modificadoras (
Ctrl
/Cmd
+ Clic),onClick
se ejecuta peroonNavigate
no, ya que Next.js previene la navegación predeterminada para nuevas pestañas.- Las URL externas no activarán
onNavigate
ya que es solo para navegaciones del mismo origen y del lado del cliente.- Los enlaces con el atributo
download
funcionarán cononClick
pero no cononNavigate
ya que el navegador tratará la URL vinculada como una descarga.
Ejemplos
Los siguientes ejemplos demuestran cómo usar el componente <Link>
en diferentes escenarios.
Enlaces a segmentos de ruta dinámicos
Para segmentos de ruta dinámicos, puede ser útil utilizar literales de plantilla para crear la ruta del enlace.
Por ejemplo, puede generar una lista de enlaces a la ruta dinámica pages/blog/[slug].js
Si el hijo es un componente personalizado que envuelve una etiqueta <a>
Si el hijo de Link
es un componente personalizado que envuelve una etiqueta <a>
, debe agregar passHref
a Link
. Esto es necesario si utiliza bibliotecas como styled-components. Sin esto, la etiqueta <a>
no tendrá el atributo href
, lo que afecta la accesibilidad de su sitio y podría perjudicar el SEO. Si utiliza ESLint, existe una regla integrada next/link-passhref
para garantizar el uso correcto de passHref
.
- Si utiliza la función JSX pragma de emotion (
@jsx jsx
), debe usarpassHref
incluso si utiliza una etiqueta<a>
directamente. - El componente debe admitir la propiedad
onClick
para activar la navegación correctamente.
Anidar un componente funcional
Si el hijo de Link
es un componente funcional, además de usar passHref
y legacyBehavior
, debe envolver el componente en React.forwardRef
:
Pasar un objeto URL
Link
también puede recibir un objeto URL y lo formateará automáticamente para crear la cadena de URL:
El ejemplo anterior tiene un enlace a:
- Una ruta predefinida:
/about?name=test
- Una ruta dinámica:
/blog/my-post
Puede utilizar todas las propiedades como se definen en la documentación del módulo URL de Node.js.
Reemplazar la URL en lugar de empujar
El comportamiento predeterminado del componente Link
es empujar
una nueva URL a la pila del historial
. Puede usar la propiedad replace
para evitar agregar una nueva entrada, como en el siguiente ejemplo:
Desactivar el desplazamiento a la parte superior de la página
El comportamiento predeterminado de Link
es desplazarse a la parte superior de la página. Cuando hay un hash definido, se desplazará al id específico, como una etiqueta <a>
normal. Para evitar el desplazamiento a la parte superior o al hash, se puede agregar scroll={false}
a Link
:
Prefetching de enlaces en Middleware
Es común usar Middleware para autenticación u otros propósitos que involucren reescribir al usuario a una página diferente. Para que el componente <Link />
pueda prefetch (precargar) correctamente los enlaces con reescrituras a través de Middleware, necesita indicarle a Next.js tanto la URL a mostrar como la URL para prefetch. Esto es necesario para evitar solicitudes innecesarias al middleware para conocer la ruta correcta a precargar.
Por ejemplo, si desea servir una ruta /dashboard
que tenga vistas autenticadas y para visitantes, puede agregar lo siguiente en su Middleware para redirigir al usuario a la página correcta:
En este caso, debería usar el siguiente código en su componente <Link />
:
Nota importante: Si está usando Rutas Dinámicas, necesitará adaptar sus props
as
yhref
. Por ejemplo, si tiene una Ruta Dinámica como/dashboard/authed/[user]
que desea presentar de manera diferente a través de middleware, escribiría:<Link href={{ pathname: '/dashboard/authed/[user]', query: { user: username } }} as="/dashboard/[user]">Profile</Link>
.
Bloqueo de navegación
Puede usar la prop onNavigate
para bloquear la navegación cuando se cumplan ciertas condiciones, como cuando un formulario tiene cambios sin guardar. Cuando necesite bloquear la navegación en múltiples componentes de su aplicación (como prevenir la navegación desde cualquier enlace mientras se edita un formulario), React Context proporciona una forma limpia de compartir este estado de bloqueo. Primero, cree un contexto para rastrear el estado de bloqueo de navegación:
Cree un componente de formulario que use el contexto:
Cree un componente Link personalizado que bloquee la navegación:
Cree un componente de navegación:
Finalmente, envuelva su aplicación con el NavigationBlockerProvider
en el layout raíz y use los componentes en su página:
Luego, use los componentes Nav
y Form
en su página:
Cuando un usuario intente navegar usando CustomLink
mientras el formulario tiene cambios sin guardar, se le pedirá confirmación antes de salir.
Historial de versiones
Versión | Cambios |
---|---|
v15.3.0 | Se agregó API onNavigate |
v13.0.0 | Ya no requiere una etiqueta <a> hija. Se proporciona un codemod para actualizar automáticamente su código. |
v10.0.0 | Las props href que apuntan a una ruta dinámica se resuelven automáticamente y ya no requieren una prop as . |
v8.0.0 | Mejora en el rendimiento del prefetching. |
v1.0.0 | Se introdujo next/link . |