官方教程: https://cn.vuejs.org/v2/guide/
vue-route
由於這不是vue必須的,但是在使用前需要先安裝vue 並且在使用前必須引入vue.js因為vue-router是依賴vue.js的
安裝
npm install vue vue-router --save
路由
- 什麼是路由?
訪問不同的路徑,就可以返回不同的結果
- 使用路由 vue-router
由於vue-router是基於vue的所以在使用前必須行引入vue
<script src="../node_modules/vue/dist/vue.js"></script>
<!-- 引入vue-router.js之前必須引入vue.js -->
<script src="../node_modules/vue-router/dist/vue-router.js"></script>
複製程式碼
基本路由
// 例項化vue-router
let vueRouter = new VueRouter({
routes: [
{path: "/home", component: home},
{path: "/list", component: list},
],
});
// 關聯到vue例項中使用router屬性
const vm = new Vue({
el: '#app',
router: vueRouter,
});
複製程式碼
在模板中使用
<router-view></router-view>
這個全域性元件即可 這個元件能夠根據VueRouter
例項中的的routes自動顯示或隱藏相應的元件
<div id="app">
<router-view></router-view>
</div>
複製程式碼
路由模式 mode
- hash(default)
- history.pushStatus('','','path');
如果想在頁面中使用
a標籤
來訪問不同的路由可以設定 則可以設定路由模式mode
的值為history
,使用<router-link>
這個全域性元件
const vueRouter = new VueRouter({
routes: [
{path: "/home", component: home},
{path: "/list", component: list},
],
mode: 'history',
});
複製程式碼
- 在模板中使用
<router-link></router-link>
元件
<div id="app">
<router-link to="/home">去首頁</router-link>
<router-link to="/list">去列表頁</router-link>
</div>
複製程式碼
注:使用
<router-link></router-link>
元件是必須加上to
屬性,to
的值是 vueRouter 例項中routes
配置的路由項 點選哪個就會顯示路由對應的元件
- 預設路由
const vueRouter = new VueRouter({
routes: [
{path: "", component: home}, // a預設路由
{path: "/home", component: home},
{path: "/list", component: list},
{path: "/*", redirect: '/home'} // b預設路由
// redirect 是重定向
],
mode: 'history',
});
複製程式碼
a預設路由
: 沒有任何路由時候,顯示這個路由對應的元件b預設路由
: 沒有匹配到任何路由時,顯示這個路由對應的元件- 注: 因為路由匹配順序的原因,這a必須
第一個
b必須在最後一個
在需要匹配404
時 建議使用這種方式
- 設定路由連線的樣式
- 設定路由標籤(預設
a標籤
) - 設定當前路由樣式
- 設定路由標籤(預設
<!-- 設定路由標籤(預設`a標籤`) -->
<div id="app">
<router-link to="/home" tag="button">去首頁</router-link>
<router-link to="/list" tag="a">列表頁</router-link>
<router-view></router-view>
</div>
複製程式碼
<!--設定活動路由樣式-->
<style>
.active {
color: #ff0000;
}
</style>
<script >
const vueRouter = new VueRouter({
routes: [
{path: "", component: home},
{path: "/home", component: home},
{path: "/list", component: list},
],
mode: 'history',
// 預設的活動路由類名叫: router-link-active
linkActiveClass: 'active',
});
</script>
複製程式碼
程式設計式路由
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue For Vue-Router</title>
<script src="./node_modules/vue/dist/vue.js"></script>
<script src="./node_modules/vue-router/dist/vue-router.js"></script>
<style>
.home, .list{
height: 300px;
color: #ffffff;
}
.home{ background: #000; }
.list{ background: #cccccc; }
</style>
</head>
<body>
<div id="app">
<router-link :to="{path:'/home'}"></router-link>
<router-link :to="{path:'/list'}"></router-link>
<router-view></router-view>
</div>
<!--template-->
<script>
// make a vue template
let home = Vue.extend({
template: "<div class='home'>home首頁 <button @click='toList'>去列表頁</button></div>",
methods:{
toList(){
this.$router.push('/list');
},
}
});
let list = Vue.extend({
template: '<div class="list">list列表頁 <button @click="toIndex">去首頁</button></div>',
methods:{
toIndex() {
this.$router.go(-1);
},
},
});
// vue-route===================
const vueRouter = new VueRouter({
routes: [
{path: "", component: home},
{path: "/home", component: home},
{path: "/list", component: list},
],
});
// vue========================
const vm = new Vue({
el: '#app',
router: vueRouter,
/**
* 只要vue類例項掛載了router屬性就會生成
* $router屬性(放方法) 和 $route屬性(放屬性)
* 可以通過 this.$router/$route 來獲得
*/
});
</script>
</body>
</html>
複製程式碼
路由巢狀
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue vue-router study</title>
<script src="./node_modules/vue/dist/vue.js"></script>
<script src="./node_modules/vue-router/dist/vue-router.js"></script>
<!--css-->
<style>
.template {
line-height: 100px;
color: #ffff00;
text-align: center;
}
.template h1 {
font-size: 30px;
}
.list {
background: #cccccc;
}
.home {
background: #000;
}
.detail {
background: #00f;
}
</style>
</head>
<body>
<!--
1.首頁 <-> 列表頁 一級路由
2. 列表頁 -> 詳情頁 二級路由
想實現一級路由,在實現二級路由
-->
<div id="app">
<router-view></router-view>
</div>
<!-- templates -->
<template id="list">
<div class="template list">
<h1>
這是list列表頁
<button @click="toIndex">去首頁</button>
<router-link to="/list/detail" tag="button">詳情頁</router-link>
</h1>
<!-- 二級路由 -->
<router-view></router-view>
</div>
</template>
<!-- javascript -->
<script>
// components
let home = Vue.extend({
template: `<div class="template home"><h1>這是Index首頁 <button @click="toList">去列表頁</button></h1></div>`,
methods: {
toList() {
this.$router.push('/list')
},
}
});
let list = Vue.extend({
template: '#list',
methods: {
toIndex() {
this.$router.push('/home')
},
}
});
let detail = Vue.extend({
template: `<div class="template detail"><h1>這是詳情頁</h1></div>`,
});
let vueRouter = new VueRouter({
routes: [
{path: '', component: home},
{path: '/home', component: home},
{
path: '/list', component: list,
children: [{path: 'detail', component: detail,}],
},
{path: '*', redirect:'/home'},
],
});
const vm = new Vue({
el: '#app',
router: vueRouter,
});
</script>
<!--
多級路由巢狀,先設定好一級路由,然後在一級路由的模板中設定子路由
<template id="list">
<div class="template list">
<h1>
這是list列表頁<button @click="toIndex">去首頁</button>
<router-link to="/list/detail" tag="button">詳情頁</router-link>
</h1>
<router-view></router-view>
</div>
</template>
-->
</body>
</html>
複製程式碼
路由(路徑)引數
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue vue-router study</title>
<script src="../node_modules/vue/dist/vue.js"></script>
<script src="../node_modules/vue-router/dist/vue-router.js"></script>
</head>
<body>
<!-- app -->
<div id="app">
<!-- 這裡的show,test,three是路由的第二個引數 -->
<router-link to="/article/1/show">第一篇文章</router-link>
<router-link to="/article/2/test">第二篇文章</router-link>
<!--<router-link to="/article/3/three">第三篇文章</router-link>-->
<!--
除了以上這種寫法,還可以用物件作為 to 的值,
如果用物件作為 to 的值,那麼必須動態的繫結to屬性(:to 或者 v-bind:to)
並且使用引數,但是這種方式必須給路由起個名字,
此時這個路由就不能再通過path跳轉,必須通過路由名字
-->
<router-link :to="{name:'articles',params:{articleId:3, other:'three'}}">第三篇文章</router-link>
<router-view></router-view>
</div>
<!-- javascript -->
<script>
let article = Vue.extend({
// 這裡的 articleId 是配置 vueRouter這個例項的 routes屬性時配置的引數 :articleId
template: `<div>這是第 {{$route.params.articleId}} 片文章</div>`,
// 如果要根據路徑引數的變化來進行相應的操作,可以監控引數的變化來進行對應的操作
watch: {
$route(){
alert("路徑引數改變了.");
}
}
});
let vueRouter = new VueRouter({
routes: [
// 路徑引數,表示值必須要有,但是值是動態的
{path: '/article/:articleId/:other', component: article, name: 'articles'}
// 設定的路由: /article/:articleId/:other
// 訪問的路由: /article/1/test
// 最終會生成一個物件儲存到 $route 屬性中: {articleId:'1', other: 'test'}
// 所以在取值是可以使用: this.$route.articleId 來取出路由傳遞的引數
],
});
const vm = new Vue({
el: '#app',
router: vueRouter,
});
</script>
</body>
</html>
複製程式碼
路由切換動畫
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue vue-router 路由切換動畫</title>
<script src="../node_modules/vue/dist/vue.js"></script>
<script src="../node_modules/vue-router/dist/vue-router.js"></script>
<style>
.test {
line-height: 50px;
background: #000;
color: skyblue;
padding: 5px 15px;
}
.fadeIn {
animation: fadeIn 1s ease-out forwards;
}
@-webkit-keyframes fadeIn{
0%{ opacity: 0; }
50%{ opacity: 0.5; }
100%{ opacity: 1; }
}
.fadeOut {
animation: fadeOut 1s ease-out forwards;
}
@-webkit-keyframes fadeOut{
0%{ opacity: 1; }
50%{ opacity: 0.5; }
100%{ opacity: 0; }
}
</style>
</head>
<body>
<!-- app -->
<div id="app">
<router-link to="/home">去首頁頁</router-link>
<router-link to="/list">去列表頁</router-link>
<!--
mode: 動畫執行的模式, 預設兩個動畫時並行的
in-out: 先進後出
out-in: 先出後進
-->
<transition enter-active-class="fadeIn" leave-active-class="fadeOut" mode="out-in">
<keep-alive>
<router-view></router-view>
</keep-alive>
</transition>
<!--
頻繁的切換元件是不停的銷燬元件,建立元件,所以為了效能,需要使用
<keep-alive></keep-alive> 這個全域性元件類快取元件
要快取哪個元件就使用使用keep-alive 把那個元件包起來
-->
</div>
<!-- javascript -->
<script>
let home = Vue.extend({
template: `<div><p class="test">home首頁</p></div>`,
});
let list = Vue.extend({
template: `<div><p class="test">list列表頁</p></div>`,
});
let vueRouter = new VueRouter({
routes: [
{path: '', component: home},
{path: '/home', component: home},
{path: '/list', component: list},
],
});
const vm = new Vue({
el: '#app',
router: vueRouter,
});
</script>
</body>
</html>
複製程式碼