vue-router是咱們在使用vue的過程之中經常會使用路由導航工具,由vue官方提供給咱們的。下面就讓咱們在項目之中來進行學習和了解。vue
經過使用vue ui咱們能夠很輕鬆的對項目進行建立,這是vue在3.x版本以後爲咱們提供的一套便捷的工具。選擇依賴的時候記得勾選vue-router就行了,vue腳手架會爲咱們自動的爲項目添加上vue-router的部份內容。vue-router
一樣,咱們也能夠經過npm等等方式來進行安裝和使用。npm
待咱們建立好初始項目內容以後,咱們能夠看到項目之中對於vue-router的使用包括在了router.js文件夾之中,main.js之中的vue對象之中引入了咱們編寫的路由內容,咱們在這裏能夠整理一下咱們的項目結構將路由單獨的放在一個文件夾之中並命名爲router,而後經過文件夾下的index.js文件來進行總體內容的導出。這樣的話目錄結構會更清晰,咱們編寫的時候能夠更專一與相對應的內容信息。瀏覽器
和vue-router相關的有兩個組件內容,咱們這裏先說明一下:bash
1.router-link: 這一個組件其實是默認將a標籤封裝了起來,咱們能夠經過設置其中的to屬性來進行路由的跳轉內容。這是最爲基礎的跳轉方式。vue爲咱們提供了以下能夠傳入的相關的參數內容:app
咱們來使用代碼嘗試一下:函數
<template>
<div id="app">
<div id="nav">
<router-link to="/">Home</router-link> |
<router-link to="/about">About</router-link> |
<router-link to="/parent">Parent</router-link> |
<router-link to="/children">Children</router-link>
</div>
<router-view/>
</div>
</template>
<style>
#nav a {
font-weight: bold;
color: #2c3e50;
}
#nav a.router-link-exact-active {
color: #42b983;
}
.activeLink{
color: #42b983;
padding: 2px;
border-radius: 2px;
border: 1px solid #2c3e50;
background-color: #aaa;
}
</style>
複製代碼
當咱們爲導航標籤設置了active-class或者exact-active-class的時候,點擊當前導航欄將會轉變樣式,其餘導航欄沒有影響,可是這兩個屬性展現的樣式有一些區別。工具
exact-active-class會先將設置的class值給與標籤,而後在將router-link-active這個屬性類給與到標籤,因此router-link-active之中的屬性可能會將設置的class之中的樣式屬性覆蓋。學習
active-class屬性的操做則是,先將router-link-eaxct-active這個class樣式給與鏈接,以後再將exact-active-class設置的class值給於到導航標籤。ui
發現:導航標籤點擊以後實際上會自動賦予兩個class屬性內容,其中一個是router-link-exact-active,另外一個是router-link-active屬性,而active-class其實是使用設置的class來替換了router-link-active這個樣式類。同理exact-active-class屬性其實是替換了router-link-exact-active屬性。
下面咱們來嘗試一下router之中的全局設置linkActiveClass和linkExactActiveClass兩個屬性。
linkActiveClass:是在router之中設置的全局屬性,幫助全部的導航標籤添加active-class屬性內容。可是有一點是須要注意的是,包含比對,將當前導航標籤地址的父級地址相對應的導航欄也設置上這一class屬性內容。例如'/a'導航活動,則'/'和'/a'的導航標籤都會添加設置的樣式類。
linkExactActiveClass:一樣是router標籤之中設置的全局屬性,幫助全部的標籤設置exact-actie-class屬性內容,比對方式是絕對比對。只有當前活動的導航對應的導航標籤會改變樣式。
固然若是咱們在全局之中設置了上面兩個屬性可是仍是有導航標籤設置了exact-active-class或者active-class的狀況,那麼標籤之中設置的屬性將會爲最優先。
接下來咱們來看一下導航標籤的自定義事件。咱們須要在導航前觸發一系列的自定義的邏輯應該怎麼辦呢。使用咱們日常寫的@click="function_name"
是沒有辦法觸發的。這個時候咱們須要在綁定的事件後面添加.native
修飾符。
2.router-view:功能性標籤內容,展現組件,而且其展現組件之中也能夠內嵌當前標籤,根據嵌套路徑,渲染嵌套組件。非router-view的屬性會自動的傳遞給當前的展現組件內容。因爲其是組建內容能夠配合使用<transition>
和<keep-alive>
兩個標籤,可是要保證<keep-alive>
標籤在內層。屬性這一方面只有name屬性:
咱們來嘗試一下內嵌的方式。
App.vue文件內容:
<router-link to="/child">Child</router-link>
Parent.vue文件內容:
<router-link to="/children">children</router-link>
<router-view/>
router.js文件內容:
{
path: '/parent',
name: 'parent',
component: () => import('../views/Parent.vue'),
children: [
{
path: '/children',
name: 'parent_children',
component: () => import('../views/Children.vue')
}
]
},
{
path: '/child',
name: 'child',
component: () => import('../views/Children.vue')
}
複製代碼
能夠看到在咱們在parent.vue之中添加了一個router-view組件而在最外層的app.vue之中能夠跳轉到parent頁面內容。parent.vue之中也有一個導航能夠跳轉到children.vue組件內容。App.vue之中也有導航能夠跳轉到children.vue組建之中。
展現結果:點擊導航爲/children的時候,app.vue的之中會展現parent.vue的內容,而parent.vue之中會展現children.vue的內容。若是點擊/child導航內容,app.vue頁面將會直接展現children.vue頁面的內容。因此展現方式是依據設置的層級來的。而router.js之中的children屬性就是咱們重要的層級設置屬性。
咱們在來嘗試一下一個組建之中有多個router-view的狀況。我麼修改一下上面的代碼:
Parent.vue文件內容:
<router-link to="/children">children</router-link>
<router-view/>
<router-view name="child2"/>
router.js
{
path: '/parent',
name: 'parent',
component: () => import('../views/Parent.vue'),
children: [
{
path: '/children',
name: 'parent_children',
components: {
default: () => import('../views/Children.vue'),
child2: () => import('../views/Children2.vue')
}
}
]
},
複製代碼
能夠看見咱們將當前配置文件之中的component屬性改爲了components,這是在設置多個展現標籤的時候須要注意的內容。而相對應parent文件之中的name就是components這個對象下面的屬性名稱,沒有設置name的那一個router-view標籤的名稱就是default。
這一部分咱們主要來了解router.js之中可用於設置的基礎屬性。和路由解析的基礎要領,首先咱們來看一下屬性吧:
屬性分爲兩種:1.全局設置屬性,2是route配置對象之中的屬性:上面實際上咱們已經看到過一些route對象配置屬性了,path,name等等這些。還有一部分以下:
/home/:id
。這時候,咱們當咱們輸入/home/123
也將會匹配這一路由,而且id的值將會設置成爲123。值能夠經過在組建之中this.$router.param來獲取。或者能夠經過設置props來用組件的props來注入。下面咱們來介紹一下全局之中的配置屬性:
/#
存在,瀏覽器也將再也不刷新展現當前頁面。可是設置了history模式以後#號將會去除,而且運用了HTML5 hsitory API,這個時候咱們須要後臺的配合才能進行正確的展現,這一塊在以後的部署之中在作詳細說明。'abstract'模式是支持全部的js環境。