Navegación con routerLink

Intermedio
Angular
Angular
Actualizado: 24/09/2025

Navegación declarativa

La navegación declarativa permite movernos entre rutas directamente desde las plantillas de componentes utilizando la directiva routerLink. Este enfoque es más eficiente que usar enlaces HTML tradicionales porque evita las recargas completas de la página, manteniendo el comportamiento de una Single Page Application (SPA).

Ventajas de routerLink sobre href

A diferencia de los enlaces HTML tradicionales con href, routerLink no recarga la página completa. En su lugar, Angular actualiza solo la parte de la aplicación que necesita cambiar, proporcionando una experiencia de usuario más fluida y mejor rendimiento.

<!-- ❌ Evitar: Recarga toda la página -->
<a href="/productos">Productos</a>

<!-- ✅ Recomendado: Navegación SPA -->
<a routerLink="/productos">Productos</a>

Sintaxis básica con strings

La forma más simple de usar routerLink es con una cadena de texto que representa la ruta de destino:

<nav>
  <a routerLink="/home">Inicio</a>
  <a routerLink="/productos">Productos</a>
  <a routerLink="/contacto">Contacto</a>
</nav>

Esta sintaxis funciona perfectamente para rutas estáticas donde conocemos exactamente la URL de destino. Angular se encarga automáticamente de generar el enlace correcto y manejar la navegación.

Sintaxis con arrays para rutas complejas

Para rutas más complejas que incluyen segmentos dinámicos, routerLink acepta un array de strings donde cada elemento representa un segmento de la ruta:

<!-- Navegación a una ruta simple -->
<a [routerLink]="['/productos']">Productos</a>

<!-- Navegación con parámetros -->
<a [routerLink]="['/productos', 'categoria', 'laptops']">Laptops</a>

<!-- Navegación con ID dinámico -->
<a [routerLink]="['/productos', producto.id]">Ver producto</a>

Nota que cuando usamos arrays, necesitamos la sintaxis de property binding con corchetes [routerLink] porque estamos pasando una expresión TypeScript en lugar de una cadena literal.

Ejemplo práctico: Menú de navegación

Aquí tienes un ejemplo completo de un componente de navegación utilizando routerLink:

// navigation.component.ts
import { Component } from '@angular/core';
import { RouterLink } from '@angular/router';

@Component({
  selector: 'app-navigation',
  standalone: true,
  imports: [RouterLink],
  template: `
    <nav class="navbar">
      <div class="nav-brand">
        <a routerLink="/">Mi Aplicación</a>
      </div>
      
      <ul class="nav-menu">
        <li><a routerLink="/dashboard">Dashboard</a></li>
        <li><a routerLink="/usuarios">Usuarios</a></li>
        <li><a routerLink="/reportes">Reportes</a></li>
        <li><a routerLink="/configuracion">Configuración</a></li>
      </ul>
    </nav>
  `,
  styles: [`
    .navbar { 
      display: flex; 
      justify-content: space-between; 
      padding: 1rem; 
    }
    .nav-menu { 
      display: flex; 
      list-style: none; 
      gap: 1rem; 
    }
    .nav-menu a { 
      text-decoration: none; 
      padding: 0.5rem 1rem; 
    }
  `]
})
export class NavigationComponent {}

Navegación relativa y absoluta

routerLink soporta tanto rutas absolutas (que comienzan con /) como rutas relativas:

<!-- Ruta absoluta: navega desde la raíz -->
<a routerLink="/admin/usuarios">Usuarios Admin</a>

<!-- Ruta relativa: navega desde la ruta actual -->
<a routerLink="detalle">Ver detalle</a>
<a routerLink="../anterior">Página anterior</a>

Las rutas relativas son especialmente útiles cuando construyes componentes reutilizables que pueden usarse en diferentes contextos de la aplicación.

Importación en componentes standalone

Para usar routerLink en componentes standalone, debes importar la directiva en el array imports:

import { Component } from '@angular/core';
import { RouterLink } from '@angular/router';

@Component({
  selector: 'app-mi-componente',
  standalone: true,
  imports: [RouterLink], // ✅ Importar RouterLink
  template: `
    <a routerLink="/ejemplo">Enlace de ejemplo</a>
  `
})
export class MiComponente {}

Esta importación es necesaria porque estamos trabajando con componentes standalone que deben declarar explícitamente todas sus dependencias.

RouterLinkActive

La directiva RouterLinkActive permite aplicar clases CSS automáticamente a los enlaces cuando su ruta coincide con la URL actual. Esta funcionalidad es esencial para crear menús de navegación intuitivos donde los usuarios pueden ver claramente en qué sección se encuentran.

Aplicación básica de clases activas

La sintaxis más simple de routerLinkActive consiste en especificar una o más clases CSS que se aplicarán cuando el enlace esté activo:

<nav>
  <a routerLink="/home" routerLinkActive="active">Inicio</a>
  <a routerLink="/productos" routerLinkActive="active">Productos</a>
  <a routerLink="/contacto" routerLinkActive="active">Contacto</a>
</nav>
.active {
  background-color: #007bff;
  color: white;
  font-weight: bold;
}

Angular detecta automáticamente cuándo la ruta actual coincide con el routerLink y aplica la clase active. Cuando el usuario navega a otra ruta, la clase se remueve automáticamente.

Múltiples clases CSS

Puedes aplicar múltiples clases utilizando un array de strings:

<a routerLink="/dashboard" 
   [routerLinkActive]="['active', 'highlighted', 'current']">
   Dashboard
</a>
.active { background-color: #f8f9fa; }
.highlighted { border-left: 3px solid #007bff; }
.current { font-weight: 600; }

Esta funcionalidad es útil cuando necesitas aplicar diferentes estilos visuales como fondos, bordes y tipografías simultáneamente.

Ejemplo completo de navegación con estilos activos

Aquí tienes un ejemplo práctico de un menú lateral con estilos para enlaces activos:

// sidebar.component.ts
import { Component } from '@angular/core';
import { RouterLink, RouterLinkActive } from '@angular/router';

@Component({
  selector: 'app-sidebar',
  standalone: true,
  imports: [RouterLink, RouterLinkActive],
  template: `
    <aside class="sidebar">
      <nav class="nav-menu">
        <a routerLink="/dashboard" 
           routerLinkActive="nav-link-active"
           class="nav-link">
          📊 Dashboard
        </a>
        
        <a routerLink="/usuarios" 
           routerLinkActive="nav-link-active"
           class="nav-link">
          👥 Usuarios
        </a>
        
        <a routerLink="/productos" 
           routerLinkActive="nav-link-active"
           class="nav-link">
          📦 Productos
        </a>
        
        <a routerLink="/reportes" 
           routerLinkActive="nav-link-active"
           class="nav-link">
          📈 Reportes
        </a>
      </nav>
    </aside>
  `,
  styles: [`
    .sidebar {
      width: 250px;
      background-color: #f8f9fa;
      height: 100vh;
      padding: 1rem;
    }
    
    .nav-menu {
      display: flex;
      flex-direction: column;
      gap: 0.5rem;
    }
    
    .nav-link {
      padding: 0.75rem 1rem;
      text-decoration: none;
      color: #495057;
      border-radius: 0.375rem;
      transition: all 0.2s ease;
    }
    
    .nav-link:hover {
      background-color: #e9ecef;
    }
    
    .nav-link-active {
      background-color: #007bff;
      color: white;
      font-weight: 500;
    }
  `]
})
export class SidebarComponent {}

RouterLinkActiveOptions para coincidencia exacta

Por defecto, routerLinkActive se activa cuando la ruta actual contiene la ruta del enlace. Para rutas que requieren coincidencia exacta, utiliza routerLinkActiveOptions:

<!-- Se activa para /home, /home/algo, /home/usuario, etc. -->
<a routerLink="/home" routerLinkActive="active">Inicio</a>

<!-- Solo se activa para /home exactamente -->
<a routerLink="/home" 
   routerLinkActive="active"
   [routerLinkActiveOptions]="{ exact: true }">
   Inicio
</a>

Esto es especialmente importante para el enlace raíz (/), que sin coincidencia exacta se activaría en todas las rutas:

<!-- ❌ Problemático: siempre estará activo -->
<a routerLink="/" routerLinkActive="active">Home</a>

<!-- ✅ Correcto: solo activo en la raíz -->
<a routerLink="/" 
   routerLinkActive="active"
   [routerLinkActiveOptions]="{ exact: true }">
   Home
</a>

Acceso programático al estado activo

También puedes acceder al estado activo mediante una variable de plantilla:

<a routerLink="/productos" 
   routerLinkActive="active"
   #productosLink="routerLinkActive">
   Productos
   @if (productosLink.isActive) {
     <span class="badge">Actual</span>
   }
</a>
.badge {
  background-color: #28a745;
  color: white;
  padding: 0.25rem 0.5rem;
  border-radius: 0.25rem;
  font-size: 0.75rem;
  margin-left: 0.5rem;
}

Esta técnica permite mostrar indicadores adicionales o ejecutar lógica cuando un enlace está activo.

Importación necesaria

Recuerda importar tanto RouterLink como RouterLinkActive en componentes standalone:

import { Component } from '@angular/core';
import { RouterLink, RouterLinkActive } from '@angular/router';

@Component({
  selector: 'app-navigation',
  standalone: true,
  imports: [RouterLink, RouterLinkActive], // ✅ Ambas directivas
  template: `
    <a routerLink="/ejemplo" routerLinkActive="active">
      Enlace con estilo activo
    </a>
  `
})
export class NavigationComponent {}

La combinación de routerLink y routerLinkActive proporciona una experiencia de navegación profesional donde los usuarios siempre saben dónde se encuentran dentro de la aplicación.

Fuentes y referencias

Documentación oficial y recursos externos para profundizar en Angular

Documentación oficial de Angular
Alan Sastre - Autor del tutorial

Alan Sastre

Ingeniero de Software y formador, CEO en CertiDevs

Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, Angular es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.

Más tutoriales de Angular

Explora más contenido relacionado con Angular y continúa aprendiendo con nuestros tutoriales gratuitos.

Aprendizajes de esta lección

  • Comprender la navegación declarativa con routerLink en Angular.
  • Diferenciar entre rutas absolutas y relativas usando routerLink.
  • Implementar rutas estáticas y dinámicas con la sintaxis de routerLink.
  • Aplicar estilos dinámicos a enlaces activos mediante routerLinkActive.
  • Configurar opciones avanzadas para la coincidencia exacta de rutas activas.