vue router 路由專題

一、前端路由
前端路由的核心是改變url 但是頁面不進(jìn)行整體的刷新
如何實(shí)現(xiàn)改變url 但是不刷新整個(gè)頁面
方法一:通過改變hash 值


image.png

方法二:通過H5 的history模式
history接口是HTML5新增的, 它有五種模式改變URL而不刷新頁面.
1.history.pushState()

image.png

因?yàn)閜ushState()相當(dāng)于入棧模式 有返回
image.png

2.history.replaceState()
相當(dāng)于替代教馆,無返回
image.png

3.history.go()
相當(dāng)于返回
返回上一頁history.go(-1)
返回下一頁history.go()

二、創(chuàng)建前端路由
步驟一: 安裝vue-router
npm install vue-router --save
步驟二: 在模塊化工程中使用它(因?yàn)槭且粋€(gè)插件, 所以可以通過Vue.use()來安裝路由功能)
第一步:導(dǎo)入路由對(duì)象享怀,并且調(diào)用
Vue.use(VueRouter)
第二步:創(chuàng)建路由實(shí)例豆同,并且傳入路由映射配置
第三步:在Vue實(shí)例中掛載創(chuàng)建的路由實(shí)例

import Vue from 'vue' 
import VueRouter from 'vue-router' 
Vue.use(VueRouter)

導(dǎo)入路由對(duì)象,并且調(diào)用


image.png

在Vue實(shí)例中掛載創(chuàng)建的路由實(shí)例


image.png

使用前端路由

1.創(chuàng)建路由組件
2.配置路由和組件的映射關(guān)系
3.使用路由:通過<router-link>和<router-view>
創(chuàng)建組件


image.png

配置組件和路由的映射關(guān)系


image.png

使用路由
image.png

<router-link>: 該標(biāo)簽是一個(gè)vue-router中已經(jīng)內(nèi)置的組件, 它會(huì)被渲染成一個(gè)<a>標(biāo)簽.
<router-view>: 該標(biāo)簽會(huì)根據(jù)當(dāng)前的路徑, 動(dòng)態(tài)渲染出不同的組件.
網(wǎng)頁的其他內(nèi)容, 比如頂部的標(biāo)題/導(dǎo)航, 或者底部的一些版權(quán)信息等會(huì)和<router-view>處于同一個(gè)等級(jí).
在路由切換時(shí), 切換的是<router-view>掛載的組件, 其他內(nèi)容不會(huì)發(fā)生改變.

路由的默認(rèn)路徑 redirect

如何可以讓路徑默認(rèn)跳到到首頁, 并且<router-view>渲染首頁組件呢?
非常簡(jiǎn)單, 我們只需要配置多配置一個(gè)映射就可以了.

const routes = [
    {
        path: '/',
        redirect:'/home'
    }
]

我們?cè)趓outes中又配置了一個(gè)映射.
path配置的是根路徑: /
redirect是重定向, 也就是我們將根路徑重定向到/home的路徑下, 這樣就可以得到我們想要的結(jié)果了.

HTML5的History模式

我們前面說過改變路由額方式有兩種
URL的hash和HTML5的history
默認(rèn)情況下子房,路徑的改變使用的hash
如果希望使用HTML5的history模式舱殿,非常簡(jiǎn)單奥裸,進(jìn)行如下配置即可

const router =new VueRouter({
routes,
mode:'history'
})

路由跳轉(zhuǎn)

router-link跳轉(zhuǎn)

在前面的<router-link>中, 我們只是使用了一個(gè)屬性: to, 用于指定跳轉(zhuǎn)的路徑.
<router-link>還有一些其他屬性:
tag: tag可以指定<router-link>之后渲染成什么組件, 比如上面的代碼會(huì)被渲染成一個(gè)<li>元素, 而不是<a>
replace: replace不會(huì)留下history記錄, 所以指定replace的情況下, 后退鍵返回不能返回到上一個(gè)頁面中
active-class: 當(dāng)<router-link>對(duì)應(yīng)的路由匹配成功時(shí), 會(huì)自動(dòng)給當(dāng)前元素設(shè)置一個(gè)router-link-active的class, 設(shè)置active-class可以修改默認(rèn)的名稱.
在進(jìn)行高亮顯示的導(dǎo)航菜單或者底部tabbar時(shí), 會(huì)使用到該類.
但是通常不會(huì)修改類的屬性, 會(huì)直接使用默認(rèn)的router-link-active即可.


image.png
代碼跳轉(zhuǎn)

在VueRouter里面所有的組件都有一個(gè)$router 屬性

this.$router.push('/home')
push==pushState
this.$router.relplace('/home')
raplace==repalceState
image.png
動(dòng)態(tài)路由跳轉(zhuǎn)

在某些情況下,一個(gè)頁面的pathl路徑可能是不確定的沪袭,比如我們進(jìn)入用戶界面時(shí)湾宙,希望如下的路徑
/user/aaaa或/user/bbbb
除了有前面的/user之外,后面還跟上了用戶的ID
這種path和Component的匹配關(guān)系冈绊,我們稱之為動(dòng)態(tài)路由(也是路由傳遞數(shù)據(jù)的一種方式)侠鳄。

const routes = [
   {
path:'/user/:id',  //動(dòng)態(tài)路由
component:User
}
]
//獲取id
<div>
<h2>{{$router.params.id}}</h2>
</div>

認(rèn)識(shí)路由的懶加載

當(dāng)打包構(gòu)建應(yīng)用的時(shí)候。javascript包會(huì)變得非常大死宣,頁面這么多放在一個(gè)js文件中, 必然會(huì)影響頁面的加載伟恶。如果我們一次性從服務(wù)器請(qǐng)求下來這個(gè)頁面, 可能需要花費(fèi)一定的時(shí)間, 甚至用戶的電腦上還出現(xiàn)了短暫空白的情況.
路由懶加載可以解決以上問題
路由懶加載的主要作用就是將路由對(duì)應(yīng)的組件打包成一個(gè)個(gè)的js代碼塊.
只有在這個(gè)路由被訪問到的時(shí)候, 才加載對(duì)應(yīng)的組件


image.png

方式一: 結(jié)合Vue的異步組件和Webpack的代碼分析.

const Home = resolve => { require.ensure(['../components/Home.vue'], () => { resolve(require('../components/Home.vue')) })};

方式二: AMD寫法

const About = resolve => require(['../components/About.vue'], resolve);

方式三: 在ES6中, 我們可以有更加簡(jiǎn)單的寫法來組織Vue異步組件和Webpack的代碼分割.

const Home = () => import('../components/Home.vue')
嵌套路由

嵌套路由是一個(gè)很常見的功能
比如在home頁面中, 我們希望通過/home/news和/home/message訪問一些內(nèi)容.
一個(gè)路徑映射一個(gè)組件, 訪問這兩個(gè)路徑也會(huì)分別渲染兩個(gè)組件.

image.png

路由跳轉(zhuǎn)傳遞參數(shù)

傳遞參數(shù)主要有兩種類型: params和query
params的類型:
配置路由格式: /router/:id
傳遞的方式: 在path后面跟上對(duì)應(yīng)的值
傳遞后形成的路徑: /router/123, /router/abc
query的類型:
配置路由格式: /router, 也就是普通配置
傳遞的方式: 對(duì)象中使用query的key作為傳遞方式
傳遞后形成的路徑: /router?id=123, /router?id=abc
傳遞方式一


image.png

傳遞方式二


image.png

獲取參數(shù)

獲取參數(shù)通過route對(duì)象獲取的. 在使用了 vue-router 的應(yīng)用中,路由對(duì)象會(huì)被注入每個(gè)組件中毅该,賦值為 this.route 博秫,并且當(dāng)路由切換時(shí),路由對(duì)象會(huì)被更新鹃骂。
通過$route獲取傳遞的信息如下:

image.png

route和router是有區(qū)別的

router為VueRouter實(shí)例台盯,想要導(dǎo)航到不同URL罢绽,則使用router.push方法
$route為當(dāng)前router跳轉(zhuǎn)對(duì)象里面可以獲取name畏线、path、query良价、params等

導(dǎo)航守衛(wèi)

什么是導(dǎo)航守衛(wèi)?
vue-router提供的導(dǎo)航守衛(wèi)主要用來監(jiān)聽監(jiān)聽路由的進(jìn)入和離開的.
vue-router提供了beforeEach和afterEach的鉤子函數(shù), 它們會(huì)在路由即將改變前和改變后觸發(fā).

們來考慮一個(gè)需求: 在一個(gè)SPA應(yīng)用中, 如何改變網(wǎng)頁的標(biāo)題呢?
網(wǎng)頁標(biāo)題是通過<title>來顯示的, 但是SPA只有一個(gè)固定的HTML, 切換不同的頁面時(shí), 標(biāo)題并不會(huì)改變.
但是我們可以通過JavaScript來修改<title>的內(nèi)容.window.document.title = '新的標(biāo)題'.
那么在Vue項(xiàng)目中, 在哪里修改? 什么時(shí)候修改比較合適呢?
我們可以利用beforeEach來完成標(biāo)題的修改.
首先, 我們可以在鉤子當(dāng)中定義一些標(biāo)題, 可以利用meta來定義
其次, 利用導(dǎo)航守衛(wèi),修改我們的標(biāo)題.
導(dǎo)航鉤子的三個(gè)參數(shù)解析:
to: 即將要進(jìn)入的目標(biāo)的路由對(duì)象.
from: 當(dāng)前導(dǎo)航即將要離開的路由對(duì)象.
next: 調(diào)用該方法后, 才能進(jìn)入下一個(gè)鉤子.


image.png
image.png

keep-alive遇見vue-router

keep-alive 是 Vue 內(nèi)置的一個(gè)組件寝殴,可以使被包含的組件保留狀態(tài),或避免重新渲染明垢。
它們有兩個(gè)非常重要的屬性:
include - 字符串或正則表達(dá)蚣常,只有匹配的組件會(huì)被緩存
exclude - 字符串或正則表達(dá)式,任何匹配的組件都不會(huì)被緩存
router-view 也是一個(gè)組件痊银,如果直接被包在 keep-alive 里面抵蚊,所有路徑匹配到的視圖組件都會(huì)被緩存:

image.png

通過create聲明周期函數(shù)來驗(yàn)證

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子贞绳,更是在濱河造成了極大的恐慌谷醉,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冈闭,死亡現(xiàn)場(chǎng)離奇詭異俱尼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)萎攒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門遇八,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人耍休,你說我怎么就攤上這事刃永。” “怎么了羊精?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵揽碘,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我园匹,道長(zhǎng)雳刺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任裸违,我火速辦了婚禮掖桦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘供汛。我一直安慰自己枪汪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布怔昨。 她就那樣靜靜地躺著雀久,像睡著了一般。 火紅的嫁衣襯著肌膚如雪趁舀。 梳的紋絲不亂的頭發(fā)上赖捌,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音矮烹,去河邊找鬼越庇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛奉狈,可吹牛的內(nèi)容都是我干的卤唉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼仁期,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼桑驱!你這毒婦竟也來了竭恬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤熬的,失蹤者是張志新(化名)和其女友劉穎萍聊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悦析,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寿桨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了强戴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亭螟。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖骑歹,靈堂內(nèi)的尸體忽然破棺而出预烙,到底是詐尸還是另有隱情,我是刑警寧澤道媚,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布扁掸,位于F島的核電站,受9級(jí)特大地震影響最域,放射性物質(zhì)發(fā)生泄漏谴分。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一镀脂、第九天 我趴在偏房一處隱蔽的房頂上張望牺蹄。 院中可真熱鬧,春花似錦薄翅、人聲如沸沙兰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鼎天。三九已至,卻和暖如春暑竟,著一層夾襖步出監(jiān)牢的瞬間斋射,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工光羞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绩鸣,地道東北人怀大。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓纱兑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親化借。 傳聞我的和親對(duì)象是個(gè)殘疾皇子潜慎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355