1.router-link和router-view元件
src/App.vie檔案內容:
<template>
<div id="app">
<div id="nav">
<router-link to="/">Home</router-link> |
<router-link to="/about">About</router-link>
</div>
<router-view/>
</div>
</template>
在App.vue檔案程式碼裡有2個router-link元件和1個router-view元件
router-link元件實際上是封裝了一個a標籤,裡面有一個重要的to屬性,to屬性指定的值是一個路徑
router-link標籤中有內容渲染,所以router-link標籤有開標籤和閉標籤
router-view元件是檢視渲染元件,通過router-link的to屬性載入的元件都會在router-view裡被渲染
router-view標籤中沒有內容渲染,所以router-view標籤可以寫成 <router-view/> 單標籤的形式,這與 <router-view></router-view> 效果相同
router-link的to屬性指定的路徑就是src/router/router.js
檔案中定義的路由
import Home from '@/views/Home.vue' // 引入Home.vue檔案並設定引入名稱為Home,@標籤是在vue.config.js檔案中定義的src路徑的別名
export default [ // 路由列表是一個陣列,在這個陣列中定義了路由物件
{ // 一個基本的路由物件包含path和component這兩個屬性
path: '/', // path屬性是在瀏覽器中輸入的跳轉路徑
component: Home, // component屬性是指定要載入渲染的元件名稱
}, {
path: '/about',
// 這裡定義的是懶載入路由,即只有當訪問這個路由時,才會載入 src/views/About.vue這個元件
component: () => import('@/views/About.vue'),
}
]
2.路由配置
2.1 動態路由
在src/router/router.js
中新建一個路由物件
import Home from '@/views/Home.vue'
export default [
{
path: '/',
component: Home,
}, {
path: '/about',
component: () => import('@/views/About.vue'),
},{
path:'/argu/:name', // 動態路由
component:() => import('@/views/argu.vue')
}
]
在src/views
目錄中建立argu.vue
檔案
argu.vue
檔案內容如下
<template>
<div>
{{ $route.params.name }}
</div>
</template>
<script>
export default {
}
</script>
在瀏覽器中輸入URL: http://localhost:8080/#/argu/apple
,頁面上會渲染URL中對應的引數
同樣的,當URL改成:http://localhost:8080/#/argu/orange
時,頁面上渲染的結果也相應改變了
在上面的例子裡,$route代表的是當前載入頁面的路由物件
,$route.params代表當前載入頁面中的引數物件
所以$route.params.name
表示的就是當前載入頁面的引數物件中的name對應位置上的的值
不管瀏覽器的URL中輸入的是name值是什麼,$route.params.name
都會被匹配到
這樣就可以起到元件複用,只需要傳遞不同的引數,同一個頁面就可以呈現不同的結果
2.2 巢狀路由
在實際開發中,經常會用到多層巢狀的元件,多層巢狀元件可以通過巢狀路由來完成
修改src/router/router.js
檔案,新建巢狀路由
import Home from '@/views/Home.vue'
export default [
{
path: '/',
component: Home,
}, {
path: '/about',
component: () => import('@/views/About.vue'),
},{
path:'/argu/:name',
component:() => import('@/views/argu.vue')
},{
path:'/parent', // 巢狀路由
component:() => import('@/views/parent.vue'),
children:[
{
path:'child',
component:() => import('@/views/child.vue')
}
]
}
]
然後在src/views
目錄下新建parent.vue
檔案和child.vue
檔案
parent.vue
檔案內容如下
<template>
<div>
I am parent page
<router-view/>
</div>
</template>
<script>
export default {
}
</script>
child.vue
檔案內容如下
<template>
<div>
I am child page
</div>
</template>
<script>
export default {
}
</script>
瀏覽器開啟URL:http://localhost:8080/#/parent/child
,渲染結果如下
2.3 命名路由
修改src/router/router.js
檔案,為路由命名
import Home from '@/views/Home.vue'
export default [
{
path: '/',
name: 'home', // 命名路由
component: Home,
}, {
path: '/about',
name: 'about', // 命名路由
component: () => import('@/views/About.vue'),
},{
path:'/argu/:name',
component:() => import('@/views/argu.vue')
},{
path:'/parent',
component:() => import('@/views/parent.vue'),
children:[
{
path:'child',
component:() => import('@/views/child.vue')
}
]
}
]
修改App.vue檔案,在router-link標籤中使用name來繫結路由名
<template>
<div id="app">
<div id="nav">
<router-link v-bind:to="{ name:'home'}">Home</router-link> |
<router-link :to="{ name:'about'}">About</router-link>
</div>
<router-view/>
</div>
</template>
<style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
}
#nav {
padding: 30px;
}
#nav a {
font-weight: bold;
color: #2c3e50;
}
#nav a.router-link-exact-active {
color: #42b983;
}
</style>
v-bind:to 方法可以簡寫成: :to
使用瀏覽器訪問URL:http://localhost:8080/#/
,在頁面上點選Home和About標籤,可以正常的渲染
2.4 命名檢視
如果想在同一個頁面上顯示多個檢視,並分別對不同的檢視進行佈局時,可以在div標籤中定義多個router-view標籤,併為每個router-view標籤定義名字,這就是命名檢視
修改src/App.vue
檔案,新增兩個命名檢視view1和view2
<template>
<div id="app">
<div id="nav">
<router-link v-bind:to="{ name:'home'}">Home</router-link> |
<router-link :to="{ name:'about'}">About</router-link>
</div>
<router-view/>
<router-view name="view1"/> // 新增router-view標籤,並把名字定義為view1
<router-view name="view2"/> // 新增router-view標籤,並把名字定義為view2
</div>
</template>
<style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
}
#nav {
padding: 30px;
}
#nav a {
font-weight: bold;
color: #2c3e50;
}
#nav a.router-link-exact-active {
color: #42b983;
}
</style>
然後修改src/router/router.js
檔案,在新新增的路由中新增兩個命名檢視
import Home from '@/views/Home.vue'
export default [
{
path: '/',
name: 'home',
component: Home,
}, {
path: '/about',
name: 'about',
component: () => import('@/views/About.vue'),
},{
path:'/argu/:name',
component:() => import('@/views/argu.vue')
},{
path:'/parent',
component:() => import('@/views/parent.vue'),
children:[
{
path:'child',
component:() => import('@/views/child.vue')
}
]
},{
path:'/named_view', // 命名檢視
components:{
// default會預設載入App.vue中沒有命名的檢視
default: () => import('@/views/child.vue'),
view1: () => import('@/views/view1.vue'),
view2: () => import('@/views/view2.vue'),
}
}
]
然後在src/views
目錄下新增view1.vue和view2.vue檔案
view1.vue檔案內容為
<template>
<div>
I am view1
</div>
</template>
view2.vue檔案內容為
<template>
<div>
I am view2
</div>
</template>
在瀏覽器中開啟URL;http://localhost:8080/#/named_view
在瀏覽器中安裝 Vue Devtool外掛,可以看到頁面上渲染了3個router-view元件
2.5 重定向路由
重定向路由的作用是把當前要訪問的URL重定向到另一個URL
修改src/router/router.js
檔案,新增重定向路由
import Home from '@/views/Home.vue'
export default [
{
path: '/',
name: 'home',
component: Home,
}, {
path: '/about',
name: 'about',
// route level code-splitting
component: () => import('@/views/About.vue'),
},{
path:'/argu/:name',
component:() => import('@/views/argu.vue')
},{
path:'/parent',
component:() => import('@/views/parent.vue'),
children:[
{
path:'child',
component:() => import('@/views/child.vue')
}
]
},{
path:'/about_path', // 重定向路由
redirect:'about'
}
]
當使用瀏覽器訪問URL:http://localhost:8080/#/about_path
時,就會跳轉到路由名為 about的路由上去,即訪問了/about
路由
在重定向路由中,也可以使用命名路由的方式
即把/about_path修改成使用命名路由的重定向方式
{
path: '/about_path',
redirect: {
name:'about'
}
}
在重定向的redirect中,也可以傳入一個函式
修改about_path路由
{
path: '/about_path',
redirect: to => {
console.log(to) // 列印出傳入的to函式
}
}
瀏覽器開啟URL:http://localhost:8080/#/about_path
,在除錯樣中檢視列印出的結果
修改about_path路由,在redirect中定義函式體
{
path: '/about_path',
redirect: to => {
return{
name:'home'
}
}
}
重新整理瀏覽器,頁面就跳轉到home頁面了
redirect中定義的to函式也可以返回一個路由路徑
{
path: '/about_path',
redirect: to => {
return '/named_view'
}
}
此時開啟URL:http://localhost:8080/#/about_path
,頁面就會跳轉到/named_view
頁面中
上面redirect中的函式體可以簡寫成
{
path: '/about_path',
redirect: to => '/named_view'
}
2.6 路由別名
路由別名,顧名思義就是為一個路由設定一個別名,設定別名以後即可以通過路由的path的值進行訪問,也可以通過別名訪問這個路由
修改src/router/router.js
檔案,為名為"home"的路由設定別名
import Home from '@/views/Home.vue'
export default [
{
path: '/',
name: 'home',
alias:'/home_page',
component: Home,
}, {
path: '/about',
name: 'about',
component: () => import('@/views/About.vue'),
},{
path:'/argu/:name',
component:() => import('@/views/argu.vue')
},{
path:'/parent',
component:() => import('@/views/parent.vue'),
children:[
{
path:'child',
component:() => import('@/views/child.vue')
}
]
},{
path:'/named_view',
components:{
default: () => import('@/views/child.vue'),
view1: () => import('@/views/view1.vue'),
view2: () => import('@/views/view2.vue'),
}
}, {
path: '/about_path',
redirect: to => '/named_view'
}
]
這樣不管訪問URL:http://localhost:8080/#/
,還是URL:http://localhost:8080/#/home_page
,都可以訪問到指定的檢視了
2.7 JS操作路由
JS操作路由就是通過JS控制頁面的跳轉和返回
首先修改src/views/Home.vue
檔案,在頁面上新增一個button按鈕
,button按鈕的值為"返回上一頁"
,button點選事件為"handleClick"
<template>
<div class="home">
<img alt="Vue logo" src="../assets/logo.png">
<HelloWorld msg="Welcome to Your Vue.js App"/>
<button @click="handleClick">返回上一頁</button> // 新新增的button按鈕
</div>
</template>
<script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue'
export default {
name: 'home',
components: {
HelloWorld
},
methods:{
handleClick () {
this.$router.back()
}
}
}
</script>
瀏覽器開啟URL:http://localhost:8080/#/
,點選About標籤跳轉到about頁面
然後再點選Home標籤,跳轉到home頁面
點選"返回上一頁"按鈕,頁面返回到當前頁的上一頁,即about頁面了
返回上一頁的JS語句也可以寫成:
handleClick () {
this.$router.go(-1)
}
或者跳轉到指定頁面:
handleClick () {
this.$router.push({
name:'about',
})
}
跳轉到指定頁面的同時需要在URL上新增引數時,可以加query選項
handleClick () {
this.$router.push({
name:'about',
query:{
name:'orange',
price:'5'
}
})
}
在home頁點選"返回上一頁"時,URL會跳轉到about頁面,並在URL上新增query中定義的引數
跳轉到前面定義的/argu
這個路由
先在src/router/router.js
檔案中,為/argu這個路由新增名字
{
path:'/argu/:name',
name:'argu',
component:() => import('@/views/argu.vue')
}
然後修改src/views/Home.vue
檔案中的handleClick方法
handleClick () {
this.$router.push({
name:'argu',
params:{
name:'orange',
}
})
}
在home頁點選"返回上一頁"時,URL會跳轉到about頁面
上面的方法也可以用ES6的語法重寫,也可以達到同樣的效果
handleClick () {
const name = 'banana'
this.$router.push({
path:`/argu/${name}` // 這裡的 ` 是鍵盤上Ese下面的那個鍵
})
}
或者
handleClick () {
this.$router.push({
name:`argu`,
params:{
name:'banana'
}
})
}
在home頁點選"返回上一頁"時,瀏覽器頁面顯示為