Vue-Router的簡單使用
Vue-Router的最簡單使用
1.先註冊路由
2.將路由註冊到VM組件中
3.定義組件
4.頁面定義跳轉路徑
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="lib/vue.min.js"></script> <script src="lib/vue-router-3.0.1.js"></script> <style type="text/css"> </style> </head> <body> <div id="app"> <!-- 由於Vue-router的hash匹配原則所以我們需要在原定義的路徑上加一個#號 --> <a href="#/login">登錄</a> <a href="#/register">註冊</a> <router-view></router-view> </div> </body> <script> var login={ template:‘<h1>登錄組件</h1>‘ } var register={ template:‘<h1>註冊組件</h1>‘ } var routerObj = new VueRouter({ routes:[ //此處的component只能使用組件對象,而不能使用註冊的模板的名稱 {path:"/login",component:login}, {path:"/register",component:register} ] }) var vm = new Vue({ el:‘#app‘, data:{ }, methods:{ }, router:routerObj//將路由規則對象註冊到VM實例上 }) </script> </html>
使用Router-Link替代a標簽
這麽做主要是為了去掉a標簽中的為了匹配hash地址的“#”,如下
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="lib/vue.min.js"></script> <script src="lib/vue-router-3.0.1.js"></script> <style type="text/css"> </style> </head> <body> <div id="app"> <!-- 由於Vue-router的hash匹配原則所以我們需要在原定義的路徑上加一個#號 --> <!-- <a href="#/login">登錄</a> <a href="#/register">註冊</a>--> <router-link to="/login" tag="span">登錄</router-link> <router-link to="/register">註冊</router-link> <router-view></router-view> </div> </body> <script> var login={ template:‘<h1>登錄組件</h1>‘ } var register={ template:‘<h1>註冊組件</h1>‘ } var routerObj = new VueRouter({ routes:[ //此處的component只能使用組件對象,而不能使用註冊的模板的名稱 {path:"/login",component:login}, {path:"/register",component:register} ] }) var vm = new Vue({ el:‘#app‘, data:{ }, methods:{ }, router:routerObj//將路由規則對象註冊到VM實例上 }) </script> </html>
同時,我們還可以利用tag標簽來渲染router-link元素,router-link默認渲染為a鏈接元素,使用tag標簽可以渲染其他元素,上述代碼中渲染為span元素了。無論渲染成什麽元素,都依然與a連接一樣擁有跳轉的點擊事件
重定向技術以及默認路徑
默認路徑
我們可以使用默認路徑的方式指定根路徑,只需要在上述路由定義的方式中加入默認路徑即可
var routerObj = new VueRouter({ routes:[ //此處的component只能使用組件對象,而不能使用註冊的模板的名稱 {path:"/",component:login}, {path:"/login",component:login}, {path:"/register",component:register} ] })
重定向方式指定默認路徑
同樣的使用一行代碼即可直接重定向到login路徑下,相比上述的默認路徑,此方式在url的展示上更為明顯
var routerObj = new VueRouter({
routes:[
//此處的component只能使用組件對象,而不能使用註冊的模板的名稱
{path:"/",redirect:"/login"},
{path:"/login",component:login},
{path:"/register",component:register}
]
})
路由選中之後高亮設置
使用默認類設置為高亮
Vue為router-link內置了一個連接點擊之後高亮的類router-link-active,即可以在自己的style中設置
<style type="text/css">
.router-link-active{
color: red;
font-weight: 800;
font-style: italic;
font-size: 30px;
}
</style>
使用自定義類名
當我們想使用第三方定義的選中樣式,或者是自己想定義更為簡潔的樣式,可以使用linkActiveClass來定義,即在路由初始化時指定類名,在指定樣式時再自定義樣式
var routerObj = new VueRouter({
routes:[
//此處的component只能使用組件對象,而不能使用註冊的模板的名稱
{path:"/",redirect:"/login"},
{path:"/login",component:login},
{path:"/register",component:register}
],
linkActiveClass:‘myactive‘
})
指定樣式
<style type="text/css">
.router-link-active,.myactive{
color: red;
font-weight: 800;
font-style: italic;
font-size: 30px;
}
</style>
路由傳參
使用query方式傳遞參數
首先我們再設置路由鏈接是指定參數
<router-link to="/login?id=10&name=zhao">登錄</router-link>
且可以指定並獲取多個參數,主要是再定義的組件對象內部使用created方法來獲得
var login={
template:‘<h1>登錄組件---{{$route.query.id}}--{{$route.query.name}}</h1>‘,
created(){
console.log(this.$route.query.id)
}
}
使用params方式傳遞參數
首先我們在路由定義的時候采用:定義params參數
var routerObj = new VueRouter({
routes:[
//此處的component只能使用組件對象,而不能使用註冊的模板的名稱
{path:"/login/:id/:name",component:login},
{path:"/register",component:register}
],
})
在實際使用過程中如何傳遞
<router-link to="/login/10/zhao">登錄</router-link>
<router-link to="/register">註冊</router-link>
<router-view></router-view>
在組件中使用
var login={
template:‘<h1>登錄組件---{{$route.params.id}}</h1>‘,
created(){
console.log(this.$route.params.id)
}
}
路由嵌套的實現
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script src="lib/vue-2.4.0.js"></script>
<script src="lib/vue-router-3.0.1.js"></script>
<style type="text/css">
</style>
</head>
<body>
<div id="app">
<router-link to="/account">Account</router-link>
<router-view></router-view>
</div>
<template id="tmpl">
<div>
<h1>這是 Account 組件</h1>
<router-link to="/account/login">登錄</router-link>
<router-link to="/account/register">註冊</router-link>
<router-view></router-view>
</div>
</template>
<script>
// 組件的模板對象
var account = {
template: ‘#tmpl‘
}
var login = {
template: ‘<h3>登錄</h3>‘
}
var register = {
template: ‘<h3>註冊</h3>‘
}
var router = new VueRouter({
routes: [
{
path: ‘/account‘,
component: account,
// 使用 children 屬性,實現子路由,同時,子路由的 path 前面,不要帶 / ,否則永遠以根路徑開始請求,這樣不方便我們用戶去理解URL地址
children: [
{ path: ‘login‘, component: login },
{ path: ‘register‘, component: register }
]
}
}
]
})
// 創建 Vue 實例,得到 ViewModel
var vm = new Vue({
el: ‘#app‘,
data: {},
methods: {},
router
});
</script>
</body>
</html>
主要是由children屬性來實現的,上述代碼中由三個易錯點
1.定義路由時,子路由沒有‘/’
2.在父組件中定義子組件要寫子組件的全路徑
3.在父組件中定義組件同樣要加入router-view元素
案例:路由命名視圖實現經典布局
命名視圖在定義路由時使用components屬性(註意不是component)來定義:
var routerObj = new VueRouter({
routes:[
//此處的component只能使用組件對象,而不能使用註冊的模板的名稱
{path:"/",components:{
default:header,
left:leftBox,
main:mainBox
}},
]
})
幾個組件分別定義如下
var header={
template:‘<h1 class="header">頭部區域</h1>‘
}
var leftBox={
template:‘<h1 class=left>左部菜單區域</h1>‘
}
var mainBox={
template:‘<h1 class="main">主體內容區域</h1>‘
}
我們在頁面上使用上述命名視圖時使用router-view的name屬性來定義
<div id="app">
<router-view></router-view>
<div id="container">
<router-view name="left"></router-view>
<router-view name="main"></router-view>
</div>
</div>
未使用命名屬t性name設置視圖組件的將采用default命名視圖
設置一下樣式
<style type="text/css">
html,body{
margin: 0;
padding: 0;
}
h1{
margin: 0;
padding: 0;
font-size: 16px;
}
.header{
background-color: #6495ED;
height: 200px;
}
#container{
display: flex;
height: 600px;
}
.left{
flex: 2;
background-color: #0000FF;
}
.main{
flex: 8;
background-color: #8A2BE2;
}
</style>
Vue-Router的簡單使用