Как правильно организовать вкладки в ангуляре?

В Angular есть несколько способов организации вкладок. Вот два наиболее популярных подхода - использование роутинга или создание компонента вкладок.

1. Использование роутинга:
В этом подходе каждая вкладка будет представлять отдельный маршрут в приложении. Для начала создадим компоненты, соответствующие каждой вкладке. Например, если у нас есть 3 вкладки: Home, About и Contact, то создадим HomeComponent, AboutComponent и ContactComponent.
Затем определим маршруты для этих компонентов в файле app-routing.module.ts:

   const routes: Routes = [
     { path: 'home', component: HomeComponent },
     { path: 'about', component: AboutComponent },
     { path: 'contact', component: ContactComponent },
   ];

Импортируйте RouterModule в AppModule и добавьте его в imports массив, а также добавьте <router-outlet> в шаблон AppComponent:

   import { RouterModule, Routes } from '@angular/router';
   
   @NgModule({
     imports: [RouterModule.forRoot(routes)],
     exports: [RouterModule]
   })
   export class AppRoutingModule { }
   <router-outlet></router-outlet>

Теперь вы можете использовать ссылки или функции routerLink для навигации между вкладками:

   <a routerLink="/home">Home</a>
   <a routerLink="/about">About</a>
   <a routerLink="/contact">Contact</a>

2. Создание компонента вкладок:
В этом подходе создаем отдельный компонент, который будет содержать в себе компоненты вкладок. Создадим компонент TabsComponent, в шаблоне которого будут размещены кнопки для переключения между вкладками, а под ними условные инструкции *ngIf, показывающие соответствующий компонент в зависимости от выбранной вкладки:

   <div>
     <button (click)="activeTab = 'home'">Home</button>
     <button (click)="activeTab = 'about'">About</button>
     <button (click)="activeTab = 'contact'">Contact</button>
   </div>
   
   <div *ngIf="activeTab === 'home'">
     <app-home></app-home>
   </div>
   <div *ngIf="activeTab === 'about'">
     <app-about></app-about>
   </div>
   <div *ngIf="activeTab === 'contact'">
     <app-contact></app-contact>
   </div>

В данном случае, вешаем на каждую кнопку событие (click), которое будет изменять свойство activeTab в компоненте TabsComponent. По значению этого свойства, будет отображаться соответствующий компонент.

Результат обоих подходов схож - при выборе вкладки будет отображен соответствующий контент. Однако, применение роутинга полезнее, если требуется использовать URL-сегменты в адресной строке для навигации между вкладками, также комбинирование роутинга и создания компонента вкладок может быть использовано для создания более сложного управления вкладками.