Vue2.0筆記——vue-router路由
使用Vue.js開發SPA(Single Page Application)單頁面應用。
vue-router可以通過html5的history API或者hash實現單頁應用,即不刷新跳轉,切換地址,只是頁面上的組件的切換;
vue-router可以實現頁面間傳參等其他功能;
基本用法
當你要把 vue-router 添加進來,我們需要做的是,將組件(components)映射到路由(routes),然後告訴 vue-router 在哪裏渲染它們。
首先我們需要定義鏈接url,而vue-router使用<router-link>對a標簽進行包裝。
HTML:
<div id="app"> <div> <!-- 通過router-link來導航,to屬性指定鏈接, 默認 會渲染成a標簽 --> <router-link to="/home">Home</router-link> <router-link to="/user">User</router-link> </div> <div> <!-- 路由出口,路由匹配到的組件將在這裏渲染 --> <router-view></router-view> </div> </div>
Javascript:
//1.定義(路由)組件 var home = {template:‘<p>This is Home Page。。。</p>‘} var user = {template:‘<p>This is User Page</p>‘} //2.定義路由,這是一組路由,每個路由使用一個大括號 const routes = [ {path:‘/home‘,component:home}, {path:‘/user‘,component:user} ]; //3.創建路由實例,然後傳入路由配置 var router= new VueRouter({ routes //縮寫,相當於routes:routes }); //4.在Vue實例中註入路由 var vm = new Vue({ el:‘#app‘, router //縮寫,相當於router:router });
運行一下,可以完美的跑起來。
router-link類樣式
我們看一下控制臺Elements,發現確實變成了<a>標簽,並且還為當前選定的<router-link>添加了class “router-link-exact-active”和“router-link-active”,我們可以為其添加類樣式。
還可以重新設置它的名稱只需要在router路由實例中配置。
linkActiveClass:‘active‘//或其他值
HTML5 History模式
我們看路徑,默認會給前面加上#號,可能會看起來很醜,我們可以使用HTML5 History模式。這種模式充分利用 history.pushState API 來完成 URL 跳轉而無須重新加載頁面
const router = new VueRouter({
mode: ‘history‘,
routes: [...]
});
而如果你這樣做的話,後臺服務器需要配置,因為我們的應用是個單頁客戶端應用,如果後臺沒有正確的配置,可能就會出現404頁面。那麽就需要一個通配符的方法解決,你可以使用重定向。
3.重定向
1.通過路徑方式
const routes=[
....
//若為/,表示默認重定向/home路徑,*則表示匹配任何則重定向到
{path:‘/‘,redirect:‘/home‘}//或者{path:‘*‘,redirect:‘/home‘}
]
當匹配找不到的時候,就會轉到這個路由。
2.通過路由名稱
當然還可以通過路由名稱的方式重定向,前提是你為路由設置了name參數
const routes = [
{path:‘/user‘,component:user,name:‘user‘},//此時通過name設置路由名稱
{path:‘/‘,redirect:{name:‘user‘}}//此處通過name屬性給與路由名稱
];
嵌套路由
嵌套路由無非是在路由裏再加路由,與組件一樣。
假如user中需要login和regist
//重新為user定義模板
<template id="user">
<div>
<ul>
<li><router-link to="/user/login">User Login</router-link></li>
<li><router-link to="/user/regist">User Regist</router-link></li>
</ul>
<router-view></router-view>
</div>
</template>
//為user路由添加子路由
children:[
{path:‘login‘,component:login},
{path:‘regist‘,component:regist}
}
//定義組件
var login = {template:‘<p>用戶登錄</p>‘}
var regist = {template:‘<p>用戶註冊</p>‘}
運行一下,可以正常顯示。
註意user模板中的router-link和router-view,他倆是一一對應的,跟外面的不一樣。
router-link標簽渲染
前面說過,router-link的默認渲染為<a>標簽,我們可以更改,通過tag屬性
<router-link to="/user/login" tag="li">User Login</router-link>
<router-link to="/user/regist" tag="li">User Regist</router-link>
動態路由匹配
如果我們通過路徑路徑來匹配到某個路由。例如,我們有一個 User 組件,對於所有 ID 各不相同的用戶,都要使用這個組件來渲染。那麽,我們可以在 vue-router 的路由路徑中使用『動態路徑參數』。
通俗地講就是參數嘛,
- 字符串參數 ?uname=xiao&pwd=123
- rest風格傳參 /yao/456
當然我們這樣映射路由的話,肯定是要參數值的,字符串的獲得參數和rest獲得參數使用了不同的方法
- 字符串參數 $route.query
- rest風格參數 $route.params
//字符串參數的方式無需配置映射路徑,直接顯示
var login = {template:‘<p>用戶登錄,獲取參數,{{$route.query}}</p>‘}
//rest方式
children:[
{path:‘login‘,component:login},
{path:‘regist/:uname/:pwd‘,component:regist}
]
var regist = {template:‘<p>用戶註冊,獲取參數,{{$route.params}}</p>‘}
主要說一下第二種動態路徑參數,它類似REST ful,匹配的路徑都能夠映射,一個『路徑參數』使用冒號 : 標記 ,當匹配到一個路由時,參數值會被設置到 this.$route.params,可以在每個組件內使用。
響應路由參數的變化
當使用路由參數時,例如從 /user/login 導航到 /user/regist,原來的組件實例會被復用。因為兩個路由都渲染同個組件,比起銷毀再創建,復用則顯得更加高效。不過,這也意味著組件的生命周期鉤子不會再被調用
復用組件時,想對路由參數的變化作出響應的話,你可以簡單地 watch(監測變化) $route 對象
watch: {
‘$route‘ (to, from) {
// 對路由變化作出響應...
}
}
匹配優先級
有時候,同一個路徑可以匹配多個路由,此時,匹配的優先級就按照路由的定義順序:誰先定義的,誰的優先級就最高。
編程式導航
router.push向當前添加一個路由並使用
除了使用 <router-link> 創建 a 標簽來定義導航鏈接,我們還可以借助 router 的實例方法,通過編寫代碼來實現。
router.push(location, onComplete?, onAbort?)
註意:在 Vue 實例內部,你可以通過 $router 訪問路由實例。因此你可以調用 this.$router.push
這個方法會向 history 棧添加一個新的記錄,所以,當用戶點擊瀏覽器後退按鈕時,則回到之前的 URL。
當你點擊 <router-link> 時,這個方法會在內部調用,所以說,點擊 <router-link :to="..."> 等同於調用 router.push(...)。
聲明式 | 編程式 |
---|---|
<router-link :to="..."> | router.push(...) |
//this.$router.push("home");//字符串,值為路由名稱
//this.$router.push({path:‘/user‘});//對象,path指定路徑
//this.$router.push({name:‘regist‘,params:{uname:‘chen‘,pwd:123}});//動態參數路由
//this.$router.push({path:‘/user/login‘,query:{uname:‘chen‘,pwd:123}});//帶查詢參數
以及
router.push({ name: ‘user‘, params: { userId }}) // -> /user/123
router.push({ path: `/user/${userId}` }) // -> /user/123
註意:如果提供了 path,params 會被忽略
你還需註意,你使用的方式是query還是params,如果你的path使用的是:標註方式的,則使用params,否則使用query
router.replace替換掉當前記錄
跟 router.push 很像,唯一的不同就是,它不會向 history 添加新記錄,而是跟它的方法名一樣 —— 替換掉當前的 history 記錄。
聲明式 | 編程式 |
---|---|
<router-link :to="..." replace> | router.replace(...) |
其語法結構與router.push方法完全一樣,只不過重要的是,不會生成一條歷史記錄。
router.go(n)前進或後退
這個方法的參數是一個整數,意思是在 history 記錄中向前或者後退多少步,類似 window.history.go(n)。
// 在瀏覽器記錄中前進一步,等同於 history.forward()
router.go(1)
// 後退一步記錄,等同於 history.back()
router.go(-1)
// 前進 3 步記錄
router.go(3)
// 如果 history 記錄不夠用,那就默默地失敗唄
router.go(-100)
router.go(100)
Vue2.0筆記——vue-router路由