Vue-route
由於Vue在開發時對路由支持的不足,後來官方補充了vue-router插件,它在Vue的生態環境中非常重要,在實際開發中只要編寫一個頁面就會操作vue-router。要學習vue-router就要先知道這裏的路由是什麼?這裏的路由並不是指我們平時所說的硬件路由器,這裏的路由就是SPA(單頁應用)的路徑管理器。再通俗的說,vue-router就是我們WebApp的鏈接路徑管理系統。
有的小夥伴會有疑慮,爲什麼我們不能像原來一樣直接用<a></a>標籤編寫鏈接哪?因爲我們用Vue作的都是單頁應用,就相當於只有一個主的index.html頁面,所以你寫的<a></a>標籤是不起作用的,你必須使用vue-router來進行管理。
Vue-router入門
安裝vue-router
npm install vue-router --save-dev
如果你安裝很慢,也可以用cnpm進行安裝,如果你在使用vue-cli中已經選擇安裝了vue-router,那這裏不需要重複安裝了。
解讀router/index.js文件
我們用vue-cli生產了我們的項目結構,你可以在src/router/index.js文件,這個文件就是路由的核心文件,我們先解讀一下它。
import Vue from 'vue' //引入Vue
import Router from 'vue-router' //引入vue-router
import Hello from '@/components/Hello' //引入根目錄下的Hello.vue組件
Vue.use(Router) //Vue全局使用Router
export default new Router({
routes: [ //配置路由,這裏是個數組
{ //每一個鏈接都是一個對象
path: '/', //鏈接路徑
name: 'Hello', //路由名稱,
component: Hello //對應的組件模板
}
]
})
項目中
import Vue from 'vue';
import VueRouter from 'vue-router';
import store from '../store'
Vue.use(VueRouter);
const router = new VueRouter({
routes: [
{
path: '/',
name: 'HousingFund',
meta: {
requireLogin: true
},
component: resolve => require(['@/page/housing-fund/Index.vue'], resolve)
},
{
path: '/hf/detail',
name: 'HousingFundDetail',
meta: {
requireLogin: true
},
component: resolve => require(['@/page/housing-fund/Detail.vue'], resolve)
}
]
})
router.beforeEach(function(to, from, next) {
const baseUrl = ''
// 從url中獲取token,用於判斷是否已登錄
const token = getUrlParam('token')
if (token) {
store.commit('SET_TOKEN', token)
}
// 判斷該路由是否需要實名認證
if (to.meta.requireAuth) {
if (token) {
// 獲取用戶信息,判斷是否已實名認證
store.dispatch('getUser', token).then(response => {
const isAuth = response
if (isAuth) {
next()
} else {
// 調用認證登錄+實名認證功能
location.href = 'http://h5test.cqliving.com/auth2.html?code=hwjr2spfcjwzrxvphql51c3i85zo4d8x&redirect_url=' +
baseUrl + to.fullPath
}
})
} else {
// 調用認證登錄+實名認證功能
location.href = 'http://h5test.cqliving.com/auth2.html?code=hwjr2spfcjwzrxvphql51c3i85zo4d8x&redirect_url=' +
baseUrl + to.fullPath
}
} else if (to.meta.requireLogin) {
if (token) {
next()
} else {
// 調用認證登錄功能
location.href = 'http://h5test.cqliving.com/auth2.html?code=7793vjwr91jwttcugo2yf2ad6mqxicyt&redirect_url=' +
baseUrl + to.fullPath
}
} else {
next()
}
})
export function getUrlParam (name) {
return decodeURIComponent((new RegExp('[?|&]'+name+'='+'([^&;]+?)(&|#|;|$)').exec(location.href)||[,""])[1].replace(/\+/g,'%20'))||null;
}
export default router;
增加一個Hi的路由和頁面
對路由的核心文件熟悉後,我們試着增加一個路由配置,我們希望在地址欄輸入 http://localhost:8080/#/hi 的時候出現一個新的頁面,先來看一下我們希望得到的效果。
-
在src/components目錄下,新建 Hi.vue 文件。
-
編寫文件內容,和我們之前講過的一樣,文件要包括三個部分<template><script>和<style>。文件很簡單,只是打印一句話。
<template>
<div class="hello">
<h1>{{ msg }}</h1>
</div>
</template>
<script>
export default {
name: 'hi',
data () {
return {
msg: 'Hi,vue'
}
}
}
</script>
<style scoped>
</style>
引入 Hi組件:我們在router/index.js文件的上邊引入Hi組件
import Hi from '@/components/Hi'
增加路由配置:在router/index.js文件的routes[]數組中,新增加一個對象,代碼如下。
{
path:'/hi',
name:'Hi',
component:Hi
}
import Vue from 'vue' //引入Vue
import Router from 'vue-router' //引入vue-router
import Hello from '@/components/Hello' //引入根目錄下的Hello.vue組件
import Hi from '@/components/Hi'
Vue.use(Router) //Vue全局使用Router
export default new Router({
routes: [ //配置路由,這裏是個數組
{ //每一個鏈接都是一個對象
path: '/', //鏈接路徑
name: 'Hello', //路由名稱,
component: Hello //對應的組件模板
},{
path:'/hi',
name:'Hi',
component:Hi
}
]
})
router-link製作導航
現在通過在地址欄改變字符串地址,已經可以實現頁面內容的變化了。這並不滿足需求,我們需要的是在頁面上有個像樣的導航鏈接,我們只要點擊就可以實現頁面內容的變化。製作鏈接需要標籤,我們先來看一下它的語法。
<router-link to="/">[顯示字段]</router-link>
- to:是我們的導航路徑,要填寫的是你在router/index.js文件裏配置的path值,如果要導航到默認首頁,只需要寫成 to=”/” ,
- [顯示字段] :就是我們要顯示給用戶的導航名稱,比如首頁 新聞頁。
明白了router-link的基本語法,我們在 src/App.vue文件中的template里加入下面代碼,實現導航。
<template>
<div id="app">
<img src="./assets/logo.png">
<router-view/>
<p>導航 :
<router-link to="/">首頁</router-link>
<router-link to="/hi">Hi頁面</router-link>
</p>
</div>
</template>
<script>
export default {
name: 'App'
}
</script>
<style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
vue-router配置子路由
改造App.vue的導航代碼,我們需要先改造app.vue的導航代碼,來實現基本的導航功能。我們用標籤增加了兩個新的導航鏈接。
App.vue代碼
<p>導航 :
<router-link to="/">首頁</router-link> |
<router-link to="/hi">Hi頁面</router-link> |
<router-link to="/hi/hi1">-Hi頁面1</router-link> |
<router-link to="/hi/hi2">-Hi頁面2</router-link>
</p>
改寫components/Hi.vue頁面
把Hi.vue改成一個通用的模板,加入<router-view>標籤,給子模板提供插入位置。“Hi頁面1” 和 “Hi頁面2” 都相當於“Hi頁面”的子頁面,有點想繼承關係。我們在“Hi頁面”里加入<router-view>標籤。
在components目錄下新建兩個組件模板 Hi1.vue 和 Hi2.vue
新建的模板和Hi.vue沒有太多的差別,只是改變了data中message的值,也就是輸出的結果不太一樣了。 Hi1.vue ···
修改router/index.js代碼 我們現在導航有了,母模板和子模板也有了,只要改變我們的路由配置文件就可以了。子路由的寫法是在原有的路由配置下加入children字段。
children:[
{path:'/',component:xxx},
{path:'xx',component:xxx},
]
children字段後邊跟的是個數組,數組裏和其他配置路由基本相同,需要配置path和component。具體看一下這個子路由的配置寫法。
import Vue from 'vue'
import Router from 'vue-router'
import Hello from '@/components/Hello'
import Hi from '@/components/Hi'
import Hi1 from '@/components/Hi1'
import Hi2 from '@/components/Hi2'
Vue.use(Router)
export default new Router({
routes: [
{
path: '/',
name: 'Hello',
component: Hello
},{
path:'/hi',
component:Hi,
children:[
{path:'/',component:Hi},
{path:'hi1',component:Hi1},
{path:'hi2',component:Hi2},
]
}
]
})
需要注意的是,在配置路由文件前,需要先用import引入Hi1和Hi2。
總結: 這節課學的內容在路由配置裏經常用到,比如我們作一個購物模塊,購物模塊裏有很多相同的元素,我們就會利用這種子路由的形式,先定一個父頁面,然後再修改子頁面。希望這節課對你有幫助,其實子路由的步驟還是有些繁瑣的,所以希望你們多練習幾遍,能夠完全掌握。
vue-router如何參數傳遞
開發中,參數的傳遞是個最基本的業務需求。通過URL地址來傳遞參數是一個形式,這節課我們就看看vue-router爲我們提供了那些傳遞參數的功能。我們先想象一個基本需求,就是在我們點擊導航菜單時,跳轉頁面上能顯示出當前頁面的路徑,來告訴用戶你想在所看的頁面位置(類似於麪包屑導航)
用name傳遞參數
在路由文件src/router/index.js裏配置name屬性。
routes: [
{
path: '/',
name: 'Hello',
component: Hello
}
]
模板裏(src/App.vue)用$route.name的形勢接收,比如直接在模板中顯示:
<p>{{ $route.name}}</p>
通過 標籤中的to傳參
也許你也會覺的上邊的傳參很不正規,也不方便,其實我們多數傳參是不用name進行傳參的,我們用標籤中的to屬性進行傳參,需要您注意的是這裏的to要進行一個綁定,寫成:to。先來看一下這種傳參方法的基本語法:
<router-link :to="{name:xxx,params:{key:value}}">valueString</router-link>
這裏的to前邊是帶冒號的,然後後邊跟的是一個對象形勢的字符串.
- name:就是我們在路由配置文件中起的name值。
- params:就是我們要傳的參數,它也是對象形勢,在對象裏可以傳遞多個值。
瞭解基本的語法後,我們改造一下我們的src/App.vue裏的標籤,我們把hi1頁面的進行修改。
<router-link :to="{name:'hi1',params:{username:'jspang'}}">Hi頁面1</router-link>
把src/reouter/index.js文件裏給hi1配置的路由起個name,就叫hi1.
{path:'/hi1',name:'hi1',component:Hi1},
最後在模板裏(src/components/Hi1.vue)用$route.params.username進行接收.
{{$route.params.username}}
總結: 今天我們學習了兩種傳參的方法,一般會使用第二種方法。我們通過學習也知道了name的用途,一種作用是傳參,一種作用是在傳參時起到名稱作用。
vue-router 利用url傳遞參數
**:**冒號的形式傳遞參數 我們可以在理由配置文件裏以:冒號的形式傳遞參數,這就是對參數的綁定。 -. 在配置文件裏以冒號的形式設置參數。我們在/src/router/index.js文件裏配置路由。
{
path:'/params/:newsId/:newsTitle',
component:Params
}
我們需要傳遞參數是新聞ID(newsId)和新聞標題(newsTitle).所以我們在路由配置文件裏制定了這兩個值。
在src/components目錄下建立我們params.vue組件,也可以說是頁面。我們在頁面裏輸出了url傳遞的的新聞ID和新聞標題。
<template>
<div>
<h2>{{ msg }}</h2>
<p>新聞ID:{{ $route.params.newsId}}</p>
<p>新聞標題:{{ $route.params.newsTitle}}</p>
</div>
</template>
<script>
export default {
name: 'params',
data () {
return {
msg: 'params page'
}
}
}
</script>
在App.vue文件里加入我們的標籤。這時候我們可以直接利用url傳值了。
<router-link to="/params/198/jspang website is very good">params</router-link> |
我們已經實現了以url方式進行傳值,這在實際開發中經常使用,必須完全瞭解。我希望你看完視頻後或者學完文章後能多練習兩邊,並在實際項目中充分使用。
正則表達式在URL傳值中的應用
上邊的例子,我們傳遞了新聞編號,現在需求升級了,我們希望我們傳遞的新聞ID只能是數字的形式,這時候我們就需要在傳遞時有個基本的類型判斷,vue是支持正則的。
加入正則需要在路由配置文件裏(/src/router/index.js)以圓括號的形式加入。
path:'/params/:newsId(\\d+)/:newsTitle',
vue-router 的重定向-redirect
redirect基本重定向
我們只要在路由配置文件中(/src/router/index.js)把原來的component換成redirect參數就可以了。我們來看一個簡單的配置。
export default new Router({
routes: [
{
path: '/',
component: Hello
},{
path:'/params/:newsId(\\d+)/:newsTitle',
component:Params
},{
path:'/goback',
redirect:'/'
}
]
})
這裏我們設置了goback路由,但是它並沒有配置任何component(組件),而是直接redirect到path:’/’下了,這就是一個簡單的重新定向。
重定向時傳遞參數
我們已經學會了通過url來傳遞參數,那我們重定向時如果也需要傳遞參數怎麼辦?其實vue也已經爲我們設置好了,我們只需要在ridirect後邊的參數裏複製重定向路徑的path參數就可以了。可能你看的有點暈,我們來看一段代碼:
{
path:'/params/:newsId(\\d+)/:newsTitle',
component:Params
},{
path:'/goParams/:newsId(\\d+)/:newsTitle',
redirect:'/params/:newsId(\\d+)/:newsTitle'
}
alias別名的使用
上節學習了路由的重定向,我相信大家已經可以熟練使用redirect進行重定向了。使用alias別名的形式,我們也可以實現類似重定向的效果。
首先我們在路由配置文件裏(/src/router/index.js),給上節課的Home路徑起一個別名,jspang。
{
path: '/hi1',
component: Hi1,
alias:'/jspang'
}
配置我們的,起過別名之後,可以直接使用<router-link>標籤裏的to屬性,進行重新定向。
<router-link < to="/jspang">jspang</router-link>
redirect和alias的區別
redirect:仔細觀察URL,redirect是直接改變了url的值,把url變成了真實的path路徑。
alias:URL路徑沒有別改變,這種情況更友好,讓用戶知道自己訪問的路徑,只是改變了<router-view>中的內容。
別名請不要用在path爲’/’中,如下代碼的別名是不起作用的。
路由的過渡動畫
想讓路由有過渡動畫,需要在<router-view>標籤的外部添加<transition>標籤,標籤還需要一個name屬性。
<transition name="fade">
<router-view ></router-view>
</transition>
我們在/src/App.vue文件裏添加了<transition>標籤,並給標籤起了一個名字叫fade。
css過渡類名: 組件過渡過程中,會有四個CSS類名進行切換,這四個類名與transition的name屬性有關,比如name=”fade”,會有如下四個CSS類名:
- fade-enter:進入過渡的開始狀態,元素被插入時生效,只應用一幀後立刻刪除。
- fade-enter-active:進入過渡的結束狀態,元素被插入時就生效,在過渡過程完成後移除。
- fade-leave:離開過渡的開始狀態,元素被刪除時觸發,只應用一幀後立刻刪除。
- fade-leave-active:離開過渡的結束狀態,元素被刪除時生效,離開過渡完成後被刪除。
那我們就在App.vue頁面里加入四種CSS樣式效果,並利用CSS3的transition屬性控制動畫的具體效果。代碼如下:
.fade-enter {
opacity:0;
}
.fade-leave{
opacity:1;
}
.fade-enter-active{
transition:opacity .5s;
}
.fade-leave-active{
opacity:0;
transition:opacity .5s;
}
上邊的代碼設置了改變透明度的動畫過渡效果,但是默認的mode模式in-out模式,這並不是我們想要的。下面我們學一下mode模式。
過渡模式mode:
- in-out:新元素先進入過渡,完成之後當前元素過渡離開。
- out-in:當前元素先進行過渡離開,離開完成後新元素過渡進入。
mode的設置和404頁面的處理
在學習過渡效果的時候,我們學了mode的設置,但是在路由的屬性中還有一個mode。這節課我們就學習一下另一個mode模式和404頁面的設置。
mode的兩個值
histroy:當你使用 history 模式時,URL 就像正常的 url,例如 http://jsapng.com/lms/,也好看!
hash:默認’hash’值,但是hash看起來就像無意義的字符排列,不太好看也不符合我們一般的網址瀏覽習慣。
const router = new VueRouter({
mode: 'history',
routes: [...]
})
404頁面的設置:
用戶會經常輸錯頁面,當用戶輸錯頁面時,我們希望給他一個友好的提示,爲此美工都會設計一個漂亮的頁面,這個頁面就是我們常說的404頁面。vue-router也爲我們提供了這樣的機制.
設置我們的路由配置文件(/src/router/index.js):
{
path:'*',
component:Error
}
這裏的path:’*’就是找不到頁面時的配置,component是我們新建的一個Error.vue的文件。
.新建404頁面:
在/src/components/文件夾下新建一個Error.vue的文件。簡單輸入一些有關錯誤頁面的內容。
<template>
<div>
<h2>{{ msg }}</h2>
</div>
</template>
<script>
export default {
data () {
return {
msg: 'Error:404'
}
}
}
</script>
路由中的鉤子
我們知道一個組件從進入到銷燬有很多的鉤子函數,同樣在路由中也設置了鉤子函數。路由的鉤子選項可以寫在路由配置文件中,也可以寫在我們的組件模板中。我們這節課就介紹這兩種鉤子函數的寫法。
路由配置文件中的鉤子函數
{
path:'/params/:newsId(\\d+)/:newsTitle',
component:Params,
beforeEnter:(to,from,next)=>{
console.log('我進入了params模板');
console.log(to);
console.log(from);
next();
},
我們在params路由裏配置了bdforeEnter得鉤子函數,函數我們採用了ES6的箭頭函數,需要傳遞三個參數。我們並在箭頭函數中打印了to和from函數。
to:路由將要跳轉的路徑信息,信息是包含在對像裏邊的。
from:路徑跳轉前的路徑信息,也是一個對象的形式。
next:路由的控制參數,常用的有next(true)和next(false)
寫在模板中的鉤子函數 在配置文件中的鉤子函數,只有一個鉤子-beforeEnter,如果我們寫在模板中就可以有兩個鉤子函數可以使用:
- beforeRouteEnter:在路由進入前的鉤子函數。
- beforeRouteLeave:在路由離開前的鉤子函數。
export default {
name: 'params',
data () {
return {
msg: 'params page'
}
},
beforeRouteEnter:(to,from,next)=>{
console.log("準備進入路由模板");
next();
},
beforeRouteLeave: (to, from, next) => {
console.log("準備離開路由模板");
next();
}
}
</script>
這是我們寫在params.vue模板裏的路由鉤子函數。它可以監控到路由的進入和路由的離開,也可以輕易的讀出to和from的值。
編程式導航
this.$router.go(-1) 和 this.$router.go(1)
這兩個編程式導航的意思是後退和前進,功能跟我們瀏覽器上的後退和前進按鈕一樣,這在業務邏輯中經常用到。比如條件不滿足時,我們需要後退。
router.go(-1)代表着後退,我們可以讓我們的導航進行後退,並且我們的地址欄也是有所變化的。
我們先在app.vue文件里加入一個按鈕,按鈕並綁定一個goback( )方法。
<button @click="goback">後退</button>
在我們的script模塊中寫入goback()方法,並使用this.$router.go(-1),進行後退操作。
<script>
export default {
name: 'app',
methods:{
goback(){
this.$router.go(-1);
}
}
}
</script>
router.go(1):代表着前進,用法和後退一樣.
this.$router.push(‘/xxx‘)
在<script>模塊里加入goHome方法,並用this.$router.push(‘/’)導航到首頁
export default {
name: 'app',
methods:{
goback(){
this.$router.go(-1);
},
goHome(){
this.$router.push('/');
}
}
}