我們在開發單頁面應用時,有時需要進入某個路由后基於參數從服務器獲取數據,那么我們首先要獲取路由傳遞過來的參數,從而完成服務器請求,所以,我們需要了解路由傳參的幾種方式,以下方式同 vue-router@4。
編程式路由傳參
除了使用
<router-link>創建 a 標簽來定義導航鏈接,我們還可以借助 router 的實例方法,通過編寫代碼來實現。
1. 通過 params 傳遞
路由配置
路徑參數 用冒號
:表示。
router.push()方法的參數可以是一個字符串路徑,或者一個描述地址的對象。
注意,如果提供了 path,params 會被忽略:
組件獲取數據
當一個路由被匹配時,它的 params 的值將在每個組件中以
this.$route.params的形式暴露出來。
2. 通過 query 傳遞
這種情況下 query (查詢參數)傳遞的參數會顯示在 url 后面,如:/details/001?kind=car。
路由配置
使用 query 時,以下三種方式都是可行的:
組件獲取數據
組件通過 $route.query 獲取:
要對同一個組件中參數的變化做出響應的話,你可以簡單地 watch
$route對象上的任意屬性,在這個場景中,就是$route.query。
3. 通過 hash 傳遞
通過此方式,url 路徑中帶有 hash,例如:/details/001#car。
路由配置
使用 hash 時,以下三種方式都是可行的(同 query):
組件獲取數據
組件通過 $route.hash.slice(1) 獲取:
通過 props 進行傳遞
在組件中使用
$route會與路由緊密耦合,這限制了組件的靈活性,因為它只能用於特定的 URL。雖然這不一定是件壞事,
以解耦的方式使用 props 進行參數傳遞,主要是在路由配置中進行操作。
1. 布爾模式
當 props 設置為 true 時,route.params 將被設置為組件的 props。
例如下面的代碼是通過 $route 的方式獲取動態字段 id:
將上面的代碼替換成 props 的形式,如下:
注意:對於有命名視圖的路由,你必須為每個命名視圖定義 props 配置:
2. 對象模式
當 props 是一個對象時,它將原樣設置為組件 props。當 props 是靜態的時候很有用。
路由配置
組件中獲取數據
<Hello /> 組件默認顯示 Hello Vue,但路由配置了 props 對象,當路由跳轉到 /hello 時,會顯示傳遞過來的 name, 頁面會顯示為 Hello World。
3. 函數模式
可以創建一個返回 props 的函數。這允許你將參數轉換為其他類型,將靜態值與基於路由的值相結合等等。
路由配置
使用函數模式時,返回 props 的函數接受的參數為路由記錄 route。
組件獲取數據
當 URL 為 /hello?say=World 時, 將傳遞 {name: 'World!'} 作為 props 傳給 Hello 組件。
此時頁面將渲染:
注意:請盡可能保持 props 函數為無狀態的,因為它只會在路由發生變化時起作用。如果你需要狀態來定義 props,請使用包裝組件,這樣 vue 才可以對狀態變化做出反應。
其他方式
1. 通過 Vuex 進行傳遞
2. 通過前端本地存儲等方式

