Angular est-il vraiment plus compliqué que React ?

Quand on débute avec Angular, il est facile de se sentir découragé face à la multitude de concepts à assimiler. Cette complexité peut inciter à se tourner vers des frameworks comme React, qui semblent plus simples à première vue. Mais est-ce vraiment le cas ?

Abonnez-vous à notre chaîne

Pour profiter des prochaines vidéos sur Angular, abonnez-vous à la nouvelle chaîne YouTube !

Skip to content

Vous souhaitez recevoir de l'aide sur ce sujet ? rejoignez la communauté Angular.fr sur Discord.

Créer un simple routeur

Dans le module, nous définissons les chemins pour les composants dans app.routes.ts :

ts
import { RouterModule, Routes } from '@angular/router';

import {OtherComponent} from './other.component';
import {MainComponent} from './main.component';

export const routes: Routes = [
  { path: '', component: MainComponent },
  { path: 'other', component: OtherComponent }
];

On admet que nous avons 2 composants : MainComponent et OtherComponent. Nous créons donc un tableau définissant les différentes routes.

Chargeons le provider du routeur

Dans le fichier app.config.ts, nous chargeons le provider du routeur :

ts
import { ApplicationConfig } from '@angular/core';
import { provideRouter } from '@angular/router';
import { routes } from './app.routes';

export const appConfig: ApplicationConfig = {
    providers: [
        provideRouter(routes)
    ]
};

provideRouter prend en paramètre le tableau des routes définies précédemment. Il permet de charger le routeur dans l'application.

Imaginons un menu de restaurant où vous avez différentes sections (entrées, plats, desserts). Pour naviguer entre ces sections, vous utilisez des onglets. C'est exactement le même principe avec RouterLink dans Angular !

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

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [RouterOutlet, RouterLink],
  template: `
    <ul>
      <li><a routerLink="/">main</a></li>
      <li><a routerLink="/other">other</a></li>
    </ul>
    <router-outlet />
  `
})
export class AppComponent {
}

RouterLink vs href

Utilisez toujours routerLink au lieu de href pour la navigation interne de votre application. routerLink empêche le rechargement complet de la page et offre une meilleure expérience utilisateur.

Mise en évidence avec RouterLinkActive

Reprenons notre analogie du menu de restaurant. Quand vous êtes dans la section "desserts", vous voulez que l'onglet "desserts" soit mis en évidence pour que les clients sachent où ils se trouvent. C'est exactement ce que fait RouterLinkActive !

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

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [RouterOutlet, RouterLink, RouterLinkActive],
  template: `
    <ul>
      <li><a routerLink="/" routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}">main</a></li>
      <li><a routerLink="/other" routerLinkActive="active">other</a></li>
    </ul>
    <router-outlet />
  `,
  styles: `
    .active {
      color: red;
      font-weight: bold;
    }
  `
})
export class AppComponent {
}

Exact Matching

Pour la route racine /, utilisez [routerLinkActiveOptions]="{exact: true}". Sans cette option, le lien serait toujours actif car tous les chemins commencent par /.

Multiple Classes

Vous pouvez ajouter plusieurs classes CSS avec RouterLinkActive :

html
<a routerLink="/" routerLinkActive="active highlighted selected">main</a>

Configuration avancée avec RouterLinkActiveOptions

Imaginons maintenant que dans notre menu de restaurant, nous voulons gérer différemment l'affichage des sous-sections. Par exemple, nous voulons que "Desserts" soit mis en évidence uniquement quand nous sommes exactement dans cette section, et pas dans ses sous-sections comme "Gâteaux" ou "Glaces". C'est là que RouterLinkActiveOptions entre en jeu !

ts
@Component({
  template: `
    <nav>
      <a routerLink="/desserts" 
         routerLinkActive="active" 
         [routerLinkActiveOptions]="{
           exact: true,
           queryParams: 'exact',
           fragment: 'preserve'
         }">
        Desserts
      </a>
    </nav>
  `
})

RouterLinkActiveOptions propose trois options principales :

ts
// L'option 'exact' assure que la classe active est appliquée 
// uniquement si l'URL correspond exactement
[routerLinkActiveOptions]="{ exact: true }"
ts
// L'option 'queryParams' gère la correspondance des paramètres de requête
[routerLinkActiveOptions]="{ queryParams: 'exact' }" // correspond exactement
[routerLinkActiveOptions]="{ queryParams: 'ignored' }" // ignore les paramètres
[routerLinkActiveOptions]="{ queryParams: 'subset' }" // correspond si sous-ensemble
ts
// L'option 'fragment' gère la correspondance du fragment d'URL
[routerLinkActiveOptions]="{ fragment: 'exact' }" // correspond exactement
[routerLinkActiveOptions]="{ fragment: 'ignored' }" // ignore le fragment

Cas d'utilisation

  • Utilisez exact: true pour les routes racines ou quand vous voulez une correspondance exacte
  • Utilisez queryParams: 'exact' pour les pages de recherche ou de filtrage
  • Utilisez fragment: 'preserve' pour les pages avec des ancres de navigation

Attention aux routes imbriquées

Sans exact: true, un lien vers /desserts sera considéré comme actif même si l'URL actuelle est /desserts/gateaux. Assurez-vous de bien comprendre la hiérarchie de vos routes avant de configurer RouterLinkActiveOptions.

Exemple complet avec différentes configurations :

ts
@Component({
  template: `
    <nav>
      <!-- Correspondance exacte de l'URL -->
      <a routerLink="/menu" 
         routerLinkActive="active" 
         [routerLinkActiveOptions]="{ exact: true }">
        Menu
      </a>

      <!-- Correspondance exacte avec paramètres de requête -->
      <a routerLink="/plats" 
         [queryParams]="{ categorie: 'pizza' }"
         routerLinkActive="active" 
         [routerLinkActiveOptions]="{ 
           exact: true,
           queryParams: 'exact'
         }">
        Pizzas
      </a>

      <!-- Ignore les fragments d'URL -->
      <a routerLink="/contact" 
         routerLinkActive="active" 
         [routerLinkActiveOptions]="{ 
           exact: true,
           fragment: 'ignored'
         }">
        Contact
      </a>
    </nav>
  `
})

Chaque mois, recevez en avant-première notre newsletter avec les dernières actualités, tutoriels, astuces et ressources Angular directement par email !