Как реализовать маршрутизацию (routing) в Angular?angular-31

Основы маршрутизации в Angular

Маршрутизация в Angular позволяет создавать одностраничные приложения (SPA) с навигацией между различными представлениями без полной перезагрузки страницы.

1. Настройка базового модуля маршрутизации

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { AboutComponent } from './about/about.component';

const routes: Routes = [
  { path: '', component: HomeComponent }, // Маршрут по умолчанию
  { path: 'about', component: AboutComponent },
  { path: 'products', loadChildren: () => import('./products/products.module').then(m => m.ProductsModule) }, // Ленивая загрузка
  { path: '**', redirectTo: '' } // Обработка 404
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

2. Основные компоненты маршрутизации

  • RouterModule: основной модуль для маршрутизации
  • Routes: массив объектов конфигурации маршрутов
  • RouterOutlet: директива-контейнер для отображения компонентов (<router-outlet></router-outlet>)
  • RouterLink: директива для навигации (<a routerLink="/about">О нас</a>)

Типы маршрутов

1. Простые маршруты

{ path: 'contact', component: ContactComponent }

2. Маршруты с параметрами

{ path: 'product/:id', component: ProductDetailComponent }

Чтение параметра в компоненте:

import { ActivatedRoute } from '@angular/router';

constructor(private route: ActivatedRoute) {
  this.route.params.subscribe(params => {
    console.log(params['id']); // Получаем ID продукта
  });
}

3. Дочерние маршруты

{
  path: 'admin',
  component: AdminComponent,
  children: [
    { path: 'users', component: UserListComponent },
    { path: 'settings', component: SettingsComponent }
  ]
}

В шаблоне AdminComponent:

<h2>Admin Panel</h2>
<nav>
  <a routerLink="users">Users</a>
  <a routerLink="settings">Settings</a>
</nav>
<router-outlet></router-outlet> <!-- Для дочерних компонентов -->

Навигация

1. Через шаблон

<a routerLink="/about" routerLinkActive="active">О нас</a>
<a [routerLink]="['/product', productId]">Детали продукта</a>

2. Программная навигация

import { Router } from '@angular/router';

constructor(private router: Router) {}

navigateToAbout() {
  this.router.navigate(['/about']);
  // Или с параметрами:
  this.router.navigate(['/product', id]);
}

Защита маршрутов

1. CanActivate

@Injectable({ providedIn: 'root' })
export class AuthGuard implements CanActivate {
  constructor(private authService: AuthService, private router: Router) {}

  canActivate(): boolean {
    if (this.authService.isLoggedIn()) {
      return true;
    } else {
      this.router.navigate(['/login']);
      return false;
    }
  }
}

Использование в маршрутах:

{
  path: 'dashboard',
  component: DashboardComponent,
  canActivate: [AuthGuard]
}

2. Другие типы guards:

  • CanActivateChild: защита дочерних маршрутов
  • CanDeactivate: предотвращение ухода с маршрута
  • Resolve: предварительная загрузка данных
  • CanLoad: защита лениво загружаемых модулей

Ленивая загрузка модулей

Оптимизация производительности за счет загрузки модулей по требованию:

{
  path: 'customers',
  loadChildren: () => import('./customers/customers.module').then(m => m.CustomersModule)
}

Передача данных через маршруты

1. Через параметры

this.router.navigate(['/product', id], {
  queryParams: { search: 'term' },
  fragment: 'section'
});

2. Чрез статические данные

{
  path: 'special',
  component: SpecialComponent,
  data: { title: 'Special Page' }
}

Чтение данных в компоненте:

this.route.data.subscribe(data => {
  console.log(data.title); // 'Special Page'
});

Резюмируем

  • RouterModule.forRoot() - основная конфигурация маршрутов
  • RouterOutlet - контейнер для отображения компонентов
  • RouterLink - навигация в шаблоне
  • Параметры маршрутов (/product/:id) и их обработка
  • Guards - защита маршрутов
  • Ленивая загрузка - оптимизация загрузки приложения
  • Дочерние маршруты - организация сложных структур
  • Передача данных через параметры, queryParams и data

Правильная реализация маршрутизации - ключ к созданию хорошо структурированных и производительных Angular-приложений.