干什么用的?


序言

在 Angular 5.X 中,有一個特別的標簽: <router-outlet> , 其實,同樣的,甚至同名的標簽,在 React 中也有。 可見 Angular 與 React 的相似性有多高!

在 app.module.ts 路由文件中,有這么一段代碼:

imports: [
     BrowserModule,
     RouterModule.forRoot(
       [
         {
          path: '',
          redirectTo:'/home',
          pathMatch: 'full'
         },

         { path: 'home', 
          component: HomeComponent 
         },
         {
          path: 'about',
          component: AboutComponent
         },
         {
          path: 'dashboard',
          component: DashboardComponent
         }
       ]
     )
   ],

這段代碼,意在配置路由, 根據不同的 URL, 跳轉到不同的頁面。 注意: 這是單頁面應用(SPA),只是局部的內容變化,不需要整個頁面跳轉。 不會出現加載的進度條。

講述了路由配置文件,再來看頁面:

index.html 是整個APP的頁面入口。 代碼如下:

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>HelloWorld</title>
  <base href="/">

  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
  <app-root></app-root>
</body>
</html>

 

關鍵的一行代碼是:

<app-root></app-root>

這里 <app-root> 相當於是局部頁面的占位符。 這個區域是動態加載的,運行時,會被 app.component.html 替換掉。具體來說,就是被以下頁面替換掉。

app.component.html 文件代碼如下:

<div style="text-align:center">
    <h1>
     {{title}}!!
    </h1>
    <nav>
      <a routerLink="home" routerLinkActive="active">Home</a>
      <a routerLink="about">About</a>
      <a routerLink="dashboard">Dashboard</a>
    </nav>
    <router-outlet></router-outlet>
  </div>

 

代碼解讀: 關鍵的代碼是:

<router-outlet></router-outlet>

可以簡單把它理解為: 頁面的占位符,動態加載,會被替換掉的。
當點擊 home、about、 dashboard 時, 在導航欄的下方,會被對應的 XX.component.html 替換掉。 這就是單頁面路由的原理。

深度理解 <router-outlet>

Routers 參數是一個有路由定義組成的一個數組。路由定義分如下兩部分:
Path:這個是用來匹配瀏覽器地址中的URL。
Component:路由對應的組件。

讓路由可用

引入 RouterModule,即把 RouterModule 添加到 AppModule 的imports 數組中。

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

<router-outlet>

如果沒有 <router-outlet>, 又會怎樣呢?

如果在瀏覽器的地址欄中添加 /about ,比如: http://localhost:4200/about
路由本應該會匹配地址,並顯示 AboutComponent 。然而事實並非如此。我們需要告訴路由要在哪里顯示這個AboutComponent組件。為了實現這個,需要在 about.component.html 的最后添加 <router-outlet> 元素,<router-outlet> 是 RouterModule 中的其中一個指令。

當然,在實際應用中,我們不會手動在地址欄中輸入/about的, 而是通過 <a> 標簽來實現。

 
  <nav>
      <a routerLink="home" routerLinkActive="active">Home</a>
      <a routerLink="about">About</a>
      <a routerLink="dashboard">Dashboard</a>
    </nav>

 

再來看個例子
<nav class="navbar navbar-default">
  <div class="container-fluid">
    <ul class="nav navbar-nav">
      <li class="active">
        <a routerLink="create" routerLinkActive="active">
          Add coins
        </a>
      </li>    
    </ul>
  </div>
</nav>

<div class="container">
  <router-outlet></router-outlet>
</div>

 

<router-outlet></router-outlet> 到底是怎么占位的呢?

當點擊 Add coins 這個 <a> 標簽時,會激活 <router-outlet>

<a routerLink="create" routerLinkActive="active">
Add coins
</a>

這個時候, 以下的 div 區域會被替換:

<div class="container">
<router-outlet></router-outlet>
</div>

 

這就是說, 如果想在哪個區域顯示 create.component.html 這個子網頁,只需要添加 <router-outlet> 就可以了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM