1. 程式人生 > >Vue專題-路由系統

Vue專題-路由系統

一切分離都是為了更好的結合,本文詳細介紹了前後端分離架構之後,前端如果實現路由控制,即Vue路由系統。

Vue路由系統

VueRouter實現原理

VueRouter的實現原理是根據監控錨點值的改變,從而不斷修改元件內容來實現的,我們來試試不使用VueRouter,自己實現路由控制,如下程式碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../statics/vue.min.js"></script>
<script src="../statics/vue-router.js"></script>
<style>
body {
margin: 0;
}
.login {
width: 100%;
height: 1200px;

}
.register {
width: 100%;
height: 1200px;

}
.home {
width: 100%;
height: 1200px;

}
a {
text-decoration: none;
}
</style>
</head>
<body>

<div id="app">
<a href="#/home">首頁</a>
<a href="#/login">登入</a>
<a href="#/register">註冊</a>
</div>

<script>
let oDiv = document.getElementById("app");

window.onhashchange = function () {
console.log(location.hash);
// vue-router的實現原理是根據錨點值的改變
// 對頁面進行切換
switch (location.hash) {
case "#/login":
oDiv.innerHTML = `<h3 class='login'>這是登入頁面</h3>`;
break;
case "#/register":
oDiv.innerHTML = `<h3 class='register'>這是註冊頁面</h3>`;
break;
default:
oDiv.innerHTML = `<h3 class='home'>這是首頁</h3>`;
break;
}
};
</script>

</body>
</html>

可以看到,通過監控錨點值的改變,頁面上面的內容可以跳轉到我們需要顯示的頁面。

VueRouter安裝使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../statics/vue.min.js"></script>
<!--1. 引入vue-router-->
<script src="../statics/vue-router.js"></script>
</head>
<body>

<div id="app">

</div>

<script>
let Home = {
template: `
<div>這是首頁</div>
`
};

let Login = {
template: `
<div>登入頁面</div>
`
};

let Register = {
template: `
<div>註冊頁面</div>
`
};

let App = {
template: `
<div>
<router-link to="/home">首頁</router-link>
<router-link to="/login">登入</router-link>
<router-link to="/register">註冊</router-link>

<router-view></router-view>
</div>
`
};

// 2. 在vue中中使用vue-router物件
Vue.use(VueRouter);

// 3. 建立一個vue-router物件
let router = new VueRouter({
// 此處要特別注意是routes,不是routers
routes: [
{
path: '/home',
component: Home,
},
{
path: "/login",
component: Login
},
{
path: "/register",
component: Register,
}
]
});

// 4. 在vue例項中使用新建立的vue-router物件
new Vue({
el: "#app",
template: `<app></app>`,
components: {
"app": App,
},
router: router
})
</script>

</body>
</html>
VueRouter命名路由
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../statics/vue.min.js"></script>
<!--1. 引入vue-router-->
<script src="../statics/vue-router.js"></script>
</head>
<body>

<div id="app"></div>

<script>
let Login = {
template: `
<div>登入頁面</div>
`
};

let Register = {
template: `
<div>註冊頁面</div>
`
};

let App = {
template: `
<div>
<router-link :to="{ name: 'login'}">登入</router-link>
<router-link :to="{ name: 'register'}">註冊</router-link>

<router-view></router-view>
</div>
`
};

// 在vue中中使用vue-router物件
Vue.use(VueRouter);

// 建立一個vue-router物件
let router = new VueRouter({
// 此處要特別注意是routes,不是routers
routes: [
{
name: 'login',
path: "/login",
component: Login
},
{
name: 'register',
path: "/register",
component: Register,
}
]
});

// 在vue例項中使用新建立的vue-router物件
new Vue({
el: "#app",
template: `<app></app>`,
components: {
"app": App,
},
router: router
})
</script>

</body>
</html>

此外,還有另一種命名路由方式,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../statics/vue.min.js"></script>
<!--1. 引入vue-router-->
<script src="../statics/vue-router.js"></script>
</head>
<body>

<div id="app"></div>

<script>

let App = {
template: `
<div>
<router-link to="/">首頁</router-link>

<router-view name="header"></router-view>
<router-view name="footer"></router-view>

</div>
`
};

Vue.use(VueRouter);

let router = new VueRouter({
routes: [
{
path: '/',
components: {
header: {
template: `
<div>頭部</div>
`
},
footer: {
template: `
<div>底部</div>
`
}
}
}
]
});

new Vue({
el: "#app",
template: `<app></app>`,
router: router,
components: {
'app': App
}
})
</script>

</body>
</html>
VueRouter路由中使用引數
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../statics/vue.min.js"></script>
<!--1. 引入vue-router-->
<script src="../statics/vue-router.js"></script>
</head>
<body>

<div id="app"></div>

<script>
// 常用的兩種查詢方式
// xxx.html/user/1
// xxx.html/user/id=1

let userParams = {
template: `
<div>使用者一資訊</div>
`
};

let userQuery = {
template: `
<div>使用者二資訊</div>
`
};

let App = {
template: `
<div>
<router-link :to="{ name: 'userParams', params: { userId: 1} }">使用者一</router-link>
<router-link :to="{ name: 'userQuery', query: { userId: 2 } }">使用者二</router-link>

<router-view></router-view>

</div>
`,
};

// 在vue中使用vue-router
Vue.use(VueRouter);

// 建立一個VueRouter物件
let router = new VueRouter({
routes: [
{
name: 'userParams',
path: '/users/:userId',
component: userParams
},
{
name: 'userQuery',
path: '/users',
component: userQuery,
}
]
});

// 在vue中使用vue-router
new Vue({
el: "#app",
template: `<app></app>`,
components: {
'app': App,
},
router: router
})
</script>

</body>
</html>
VueRouter引數實現原理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../statics/vue.min.js"></script>
<!--1. 引入vue-router-->
<script src="../statics/vue-router.js"></script>
</head>
<body>

<div id="app"></div>

<script>
// 常用的兩種查詢方式
// xxx.html/user/1
// xxx.html/user/id=1

let userParams = {
template: `
<div>使用者一資訊</div>
`,
created () {
console.log('this: ', this);
console.log(this.$route);
console.log(this.$route.params.userId);
// 此時可以傳送ajax請求到後端獲取資料
}
};

let userQuery = {
template: `
<div>使用者二資訊</div>
`,
created () {
console.log(this.$route);
console.log(this.$route.query.userId);
// 此時可以傳送ajax請求到後端獲取資料
}
};

let App = {
template: `
<div>
<router-link :to="{ name: 'userParams', params: { userId: 1} }">使用者一</router-link>
<router-link :to="{ name: 'userQuery', query: { userId: 2 } }">使用者二</router-link>

<router-view></router-view>

</div>
`,
};

// 在vue中使用vue-router
Vue.use(VueRouter);

// 建立一個VueRouter物件
let router = new VueRouter({
routes: [
{
name: 'userParams',
path: '/users/:userId',
component: userParams
},
{
name: 'userQuery',
path: '/users',
component: userQuery,
}
]
});

// 在vue中使用vue-router
new Vue({
el: "#app",
template: `<app></app>`,
components: {
'app': App,
},
router: router,
created () {
console.log('this: ', this);
console.log(this.$route);
}
})
</script>

</body>
</html>
VueRouter子路由
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.home {
width: 500px;
height: 500px;

}
.courses {
width: 500px;
height: 500px;

}

</style>
<script src="../statics/vue.min.js"></script>
<!--1. 引入vue-router-->
<script src="../statics/vue-router.js"></script>
</head>
<body>

<div id="app"></div>

<script>
let Home = {
template: `
<div class="home">這是首頁</div>
`
};

let Courses = {
template: `
<div class="courses">課程頁面
<div class="details">
<router-link to="details">課程詳情</router-link>
<router-link to="students">學員故事</router-link>

<router-view></router-view>
</div>
</div>
`
};

let Details = {
template: `
<div>課程詳情頁</div>
`
};

let Students = {
template: `
<div>學員故事</div>
`
};

let App = {
template: `
<div>
<router-link to="/">首頁</router-link>
<router-link to="/courses">課程頁面</router-link>

<router-view></router-view>
</div>
`
};

let routes = [
{
path: '/',
component: Home
},
{
path: '/courses',
component: Courses,
children: [
{
path: 'details',
component: Details,
},
{
path: 'students',
component: Students
}
]
}
];

Vue.use(VueRouter);

let router = new VueRouter({
routes: routes,
});

new Vue({
el: "#app",
template: `<app></app>`,
router: router,
components: {
'app': App,
}
})

</script>

</body>
</html>
VueRouter子路由append
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.home {
width: 500px;
height: 500px;

}
.courses {
width: 500px;
height: 500px;

}

</style>
<script src="../statics/vue.min.js"></script>
<!--1. 引入vue-router-->
<script src="../statics/vue-router.js"></script>
</head>
<body>

<div id="app"></div>

<script>
let Home = {
template: `
<div class="home">這是首頁</div>
`
};

let Courses = {
template: `
<div class="courses">課程頁面
<div class="details">
<router-link to="details" append>課程詳情</router-link>
<router-link to="students">學員故事</router-link>

<router-view></router-view>
</div>
</div>
`
};

let Details = {
template: `
<div>課程詳情頁</div>
`
};

let Students = {
template: `
<div>學員故事</div>
`
};

let App = {
template: `
<div>
<router-link to="/">首頁</router-link>
<router-link to="/courses">課程頁面</router-link>

<router-view></router-view>
</div>
`
};

let routes = [
{
path: '/',
component: Home
},
{
path: '/courses',
component: Courses,
children: [
{
path: 'details',
component: Details,
},
{
path: 'students',
component: Students
}
]
}
];

Vue.use(VueRouter);

let router = new VueRouter({
routes: routes,
});

new Vue({
el: "#app",
template: `<app></app>`,
router: router,
components: {
'app': App,
}
})

</script>

</body>
</html>

使用以上方式,路徑是寫死在屬性中的,所以子路徑會不斷的append到最後,導致訪問不到相應頁面。可以採用另一種,動態繫結屬性,如下程式碼所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../statics/vue.min.js"></script>
<script src="../statics/vue-router.js"></script>
<style>
body {
margin: 0;
}
.all {
width: 500px;
height: 500px;
}
.home {

}
.login {

}
.register {

}
.courses {

}
</style>
</head>
<body>

<div id="app"></div>

<script>
Vue.use(VueRouter);

let Home = {
template: `
<div class="home all">
<h1>這是首頁頁面</h1>
</div>
`
};

let Login = {
template: `
<div class="login all">
<h1>這是登入頁面</h1>
</div>
`
};

let Register = {
template: `
<div class="register all">
<h1>這是註冊頁面</h1>
</div>
`
};

let Courses = {
template: `
<div class="courses all">
<h1>這是課程頁面</h1>
<router-link :to="{ name: 'lightcourses' }" append>輕課</router-link>
<router-link :to="{ name: 'degreecourses' }">學位課</router-link>

<router-view><router-view>
</div>
`
};

let LightCourses = {
template: `
<div>
<h1>這是學位課程頁面</h1>
</div>
`
};

let DegreeCourses = {
template: `
<div>
<h1>這是輕課課程頁面</h1>
</div>
`
};

let App = {
template: `
<div>
<router-link :to="{ name: 'home' }">首頁</router-link>
<router-link :to="{ name: 'login' }">登入</router-link>
<router-link :to="{ name: 'register' }">註冊</router-link>
<router-link :to="{ name: 'courses' }">課程</router-link>

<router-view><router-view>
</div>
`,
};

let routes = [
{
name: 'home',
path: '/home',
component: Home,
},
{
name: 'login',
path: '/login',
component: Login,
},
{
name: 'register',
path: '/register',
component: Register
},
{
name: 'courses',
path: '/courses',
component: Courses,
children: [
{
name: 'lightcourses',
path: 'lightcourses',
component: LightCourses
},
{
name: 'degreecourses',
path: 'degreecourses',
component: DegreeCourses
}
]
}
];

let router = new VueRouter({
routes: routes,
mode: 'history',
});

new Vue({
el: "#app",
template: `<App></App>`,
components: {
App,
},
router: router,
})
</script>

</body>
</html>