我們經常需要把某種模式匹配到所有的路由,全都映射到同個組件。例如,我們有一個User組件,對于所有ID各部相同的用戶,都要使用這個組件來渲染。那么,我們可以在vue-router的路由路徑中使用『動態路徑參數』(dynamic segment)來達到這個效果:
const User = {
template: '<div>User</div>'
}
const router = new VueRouter({
routes: [
// 動態路徑參數 以冒號開頭
{ path: '/user/:id', component: User }
]
})
現在呢,像** /user/foo **和 /user/bar 都將映射到相同的路由。
一個『路徑參數』使用冒號 : 標記。當匹配到一個路由時,參數值會被設置到 this.$route.params,可以在每個組件內使用。于是,我們可以更新** User **的模板,輸出當前用戶的 ID:
const User = {
template: '<div>User {{ $route.params.id }}</div>'
}
你可以在一個路由中設置多段『路徑參數』,對應的值都會設置到 $route.params 中。例如:
模式 | 匹配路徑 | $route.params |
---|---|---|
/user/:username | /user/evan | { username: 'evan' } |
/user/:username/post/:post_id | /user/evan/post/123 | { username: 'evan', post_id: |
除了** $route.params**
外,$route
對象還提供了其它有用的信息,例如,$route.query
(如果 URL 中有查詢參數)、$route.hash
等等。你可以查看 API 文檔 的詳細說明。
響應路由參數的變化
提醒一下,當使用路由參數時,例如從 /user/foo 導航到 user/bar,原來的組件實例會被復用。因為兩個路由都渲染同個組件,比起銷毀再創建,復用則顯得更加高效。不過,這也意味著組件的生命周期鉤子不會再被調用。
復用組件時,想對路由參數的變化作出響應的話,你可以簡單地 watch(監測變化)$route 對象:
const User = {
template: '...',
watch: {
'$route' (to, from) {
// 對路由變化作出響應...
}
}
}