1、路由基礎
(1)安裝 vue-router:
cnpm install vue-router --save
(2)如果在一個模塊化工程中使用它,必須要通過 Vue.use() 初始化路由插件:
import Vue from 'vue' import VueRouter from 'vue-router' Vue.use(VueRouter)
(3)創建路由格式:
const router = new VueRouter({ routes:[ { path: "/learn", // 訪問路由的路徑 name: "Learn", // 路由名稱 component: Learn // 對應組件 } ] })
(4)給出路由顯示位置:
<div id="app"> <!-- 路由出口 --> <!-- 路由匹配到的組件將渲染在這里 --> <router-view></router-view> </div>
(5)使用示例:
首先在 src 目錄下創建一個 router 文件夾,同時在該文件夾下創建一個 index.js 文件,目錄結構如下:

index.js 文件內容:
import Vue from 'vue' import VueRouter from 'vue-router' import Learn from '@/components/Learn' import HelloWord from '@/components/HelloWorld' // 初始化 VueRouter 插件 Vue.use(VueRouter) // 創建路由 export default new VueRouter({ routes: [ { path: '/learn', name: 'Learn', component: Learn }, { path: '/hello', name: 'Hello', component: HelloWord } ] })
然后創建 Learn.vue,HelloWorld.vue 兩個文件,目錄結構如下:

HelloWorld.vue 文件內容:
<template>
<div class="container">
<p>This is HelloWorld</p>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
data () {
return {
}
}
}
</script>
Learn.vue 文件內容:
<template>
<div class="container">
<p>This is learn</p>
</div>
</template>
<script>
export default {
name: "Learn",
data() {
return {
};
}
};
</script>
App.vue 文件內容:
<template>
<div id="app">
<img src="./assets/logo.png">
<p>
<!-- 使用聲明式導航 router-link 組件來導航. -->
<!-- 通過傳入 `to` 屬性指定鏈接. -->
<!-- <router-link> 默認會被渲染成一個 `<a>` 標簽 -->
<router-link to="/hello">go to hello</router-link>
<router-link to="/learn">go to learn</router-link>
</p>
<!-- 路由顯示位置 -->
<router-view/>
</div>
</template>
<script>
export default {
name: "App",
data() {
return {
}
}
};
</script>
main.js 文件內容:
import Vue from 'vue' import App from './App' // 引入路由對象 import router from './router' Vue.config.productionTip = false /* eslint-disable no-new */ new Vue({ el: '#app', render: h => h(App), router // 注入路由對象 })

如上,當點擊不同鏈接時,紅色框會顯示指定路徑所對應的組件內容。
2、傳遞參數
聲明式導航(<router-link>)傳參
HelloWorld.vue :

App.vue:

頁面效果:

(2)聲明式導航(使用命名路由,對象參數):
App.vue :

(3)聲明式導航(使用命名路由,查詢參數):
查詢參數就是在路由地址后面帶上參數,與傳統的 url 參數一致,會變成 /hello?userId=1111
App.vue :

HelloWorld.vue:

頁面效果:

(4)編程式導航(與聲明式導航一樣,只是寫法不同,實際開發中以這種方式為主):
// 字符串 this.$router.push('/hello') // 對象 this.$router.push({ path: '/hello' }) // 對象 + 路徑字符串參數 const userId = '1111' this.$router.push({ path: '/hello/${userId}' }) // -> /hello/1111 // 命名的路由 this.$router.push({ name: 'Hello', params: { userId: '1111' }}) // 帶查詢參數,變成 /hello?userId=1111 this.$router.push({ path: '/hello', query: { userId: '1111' }})
3、嵌套路由
(1)在 components 目錄下,創建 Python.vue、Linux.vue 兩個文件:

Python.vue:
<template>
<div class="python">
<p>學習Python</p>
</div>
</template>
<script>
export default {
name: 'Python',
data() {
return {
}
}
}
</script>
Linux.vue:
<template>
<div class="linux">
<p>學習Linux</p>
</div>
</template>
<script>
export default {
name: 'Linux',
data() {
return {
}
}
}
</script>
router/index.js:
import Vue from 'vue' import VueRouter from 'vue-router' import Learn from '@/components/Learn' import HelloWorld from '@/components/HelloWorld' /* 導入子組件 */ import Python from '@/components/Python' import Linux from '@/components/Linux' // 初始化 VueRouter 插件 Vue.use(VueRouter) // 創建路由 export default new VueRouter({ routes: [ { path: '/learn', name: 'Learn', component: Learn, // 使用 children 定義子組件 children: [ { // 以"/"開頭的嵌套路徑會被當作根路徑,所以子路由上不用加"/; // 在生成路由時,主路由上的path會被自動添加到子路由之前, // 所以子路由上的path不用在重新聲明主路由上的path了。 // Python 會被渲染在 Learn 的 <router-view> 中 path: 'python', name: 'Python', component: Python }, { // Linux 會被渲染在 Learn 的 <router-view> 中 path: 'linux', name: 'Linux', component: Linux } ] }, { path: '/hello', name: 'Hello', component: HelloWorld } ] })
Learn.vue:
<template>
<div class="container">
<p>This is learn</p>
<router-link to="/learn/python">learn python</router-link>
<router-link to="/learn/linux">learn linux</router-link>
<!-- Learn 的子組件會被渲染在 <router-view> 中 -->
<router-view/>
</div>
</template>
<script>
export default {
name: "Learn",
data() {
return {
};
}
};
</script>
App.vue:
<template>
<div id="app">
<img src="./assets/logo.png" />
<div>
<router-link to="/learn">go to learn</router-link>
</div>
<router-view />
</div>
</template>
<script>
export default {
name: "App",
data() {
return {
};
}
};
</script>
頁面效果:

4、路由雜項
(1)404 Not Found路由:
router/index.js :
// 訪問根路徑時,匹配到 Learn 組件 { path: '/', component: Learn }, // * 號為通用匹配,即匹配所有路徑,通常用於客戶端 404 錯誤 { path: '*', component: NotFound }
// 給出一個路由 { path: '/user-*' } this.$router.push('/user-admin') this.$route.params.pathMatch // 'admin' // 給出一個路由 { path: '*' } this.$router.push('/non-existing') this.$route.params.pathMatch // '/non-existing'
(2)history 模式:
const router = new VueRouter({ mode: 'history', routes: [...] })
當你使用 history 模式時,URL 就像正常的 url,例如 http://yoursite.com/user/id,也好看!
所以呢,你要在服務端增加一個覆蓋所有情況的候選資源:如果 URL 匹配不到任何靜態資源,則應該返回同一個 index.html 頁面,這個頁面就是你 app 依賴的頁面。
比如 Nginx 配置:
location / {
try_files $uri $uri/ /index.html;
}
參考:
《Vue.js 實戰》
https://cn.vuejs.org/v2/guide/

