前端路由概述
前端路由為 單頁應用(SPA) 的基礎標配。
路由這個概念來自後端伺服器,透過不同的路徑,回傳不同的網頁內容,每次請求都會刷新頁面,因此會不定時間的空白畫面。
隨著 AJAX 技術的盛行,資料請求不再需要刷新頁面,開始有前後端分離的開發模式,前端只需要接收後端傳遞的資料,再將內容渲染出來。各種 MVVM 框架的興起,前端發展逐漸走向 SPA,由於只有單一個 html,一但加載完成,並不會因為使用者的操作而重新載入或跳轉,取而代之的是利用 JS 動態切換不同的元件,改變 URL 但頁面整體不刷新。
前端路由是 URL 與畫面之間的關係,有兩種實現方式 history 和 hash,詳細可以參考這篇文章:Web 前端路由原理解析和实现。
Vue Router
Vue Router 是 Vue.js 官方的路由管理器。頁面的路徑改變就是元件的切換。
1. CDN
|
|
2. Vue CLI 專案
安裝:
|
|
配置檔:
- Vue CLI3 為
router.js
- Vue CLI4 為
/router/index.js
|
|
將 router
掛載到 Vue 實體:
|
|
基本範例
|
|
<router-link>
與 <router-view>
為 Vue Router 提供的元件:
<router-link>
預設為<a>
,透過to
特性用於指定跳轉的連結;- 而
<router-view>
是負責掛載路由匹配到畫面的元件。
|
|
CodePen Demo:Vue 2.x - Vue Router 基本範例
配置路由
配置路由映射,元件和路徑映射的關係。
routes
為一個陣列,僅能接受 RouteConfig 設定資料物件,這個物件本身包含了以下基本屬性:
path
:對應的虛擬路徑,從base
開始算。component
:路由配置的 Vue 元件。
|
|
其他屬性之後會慢慢提到。
路由連結
1. router-link 元件
<router-link>
元件,預設會解析成 HTML 的 <a>
標籤,有兩個屬性可設定:
|
|
to
除了接受路徑字串,也可以使用 v-bind
來綁定一個物件。點擊 <router-link>
會在內部呼叫路由實體 push
方法,更多詳細用法會在 程式控制 說明。
2. active 樣式
對應的路由匹配成功時,<router-link>
會自動添加一個 active-class
類別。
可以使用 .router-link-active
來定義樣式:
|
|
或是透過 active-class
特性,各別引入自定義類別名稱:
|
|
|
|
如果不想要各別引入自定義類別名稱,可以設置 Router 的linkActiveClass
選項:
|
|
2. 精確匹配模式
要注意,當前路由的所有父級都會添加 active-class
,舉例:/about
就包含 /
也添加 active-class
。
而精確匹配的 <router-link>
還會添加一個 exact-active-class
,用法與 active-class
相同,Router 選項為 linkExactActiveClass
(預設值 'router-link-exact-active'
)。
你可以改用 .router-link-exact-active
來定義 active 樣式,就可以避免父級也套用 active 樣式。
或者使用 exact
精確匹配模式:
|
|
使用精確匹配模式,只有路由完全匹配時才會添加 active-class
。
CodePen Demo:Vue 2.x - Vue Router active class
路由渲染
<router-view>
路由配置元件,會渲染當前路徑指定的元件。如果要設置複數 <router-view>
,有 name
特性可以設置名稱。
因為它也是個元件,所以可以配合 <transition>
和 <keep-alive>
使用。
路由實體 & 路由物件
1. 路由實體
在 Vue 實體內,可以透過 $router
獲取路由實體,我們能透過它來呼叫路由方法。
2. 路由物件
另外,還可以透過 $route
獲取當前的路由資訊,包含了當前 URL 解析得到的資訊。
這個物件 唯讀,可用於監聽變化。部分屬性之後會提到,詳細屬性可以先參考 文件 API。