vue-router

安裝

vue add router

vue-router 的兩種模式

一被因、hash模式

后面的hash值變化,并不會導致瀏覽器向服務器發(fā)出請求,瀏覽器不發(fā)出請求也就不會刷新

頁面事富,每次hash值變化,會觸發(fā)hashchange這個事件乘陪,通過這個事件我們就可以知道hash值
發(fā)生了什么變化统台,然后通過監(jiān)聽hashchange來實現(xiàn)更新頁面部分內容的操作。

window.onhashchange = function(event){
 
    console.log(event.oldURL, event.newURL);
    let hash = location.hash.slice(1);
    document.body.style.color = hash;
 
}

二啡邑、history模式

pushState() 和 replaceState()贱勃。通過這兩個 API
(1)可以改變 url 地址且不會發(fā)送請求,
(2)不僅可以讀取歷史記錄棧谤逼,還可以對瀏覽器歷史記錄棧進行修改贵扰。
除此之外,還有popState().當瀏覽器跳轉到新的狀態(tài)時流部,將觸發(fā)popState事件.

區(qū)別:

前面的hashchange戚绕,你只能改變#后面的url片段。而pushState設置的新URL可以是與當前URL同源的任意URL枝冀。
history模式則會將URL修改得就和正常請求后端的URL一樣,如后端沒有配置對應/user/id的路由處理舞丛,則會返回404錯誤
當用戶刷新頁面之類的操作時,瀏覽器會給服務器發(fā)送請求宾茂,所以這個實現(xiàn)需要服務器的支持瓷马,需要把所有路由都重定向到根頁面

router與route的區(qū)別

  1. route從當前router跳轉對象里面可以獲取name、path跨晴、query欧聘、params等(<router-link>傳的參數(shù)由 this.route.query或者 this.$route.params 接收)
  2. router為VueRouter實例。想要導航到不同URL端盆,則使用router.push方法怀骤;返回上一個history也是使用$router.go方法

vue-router的構子函數(shù)

模塊一:全局導航鉤子函數(shù)

1费封、vue router.beforeEach(全局前置守衛(wèi))
beforeEach的鉤子函數(shù),它是一個全局的before 鉤子函數(shù)蒋伦, (before each)意思是在 每次每一個路由改變的時候都得執(zhí)行一遍弓摘。
2、vue router.afterEach(全局后置守衛(wèi))
router.beforeEach 是頁面加載之前痕届,相反router.afterEach是頁面加載之后
它的三個參數(shù):
to: (Route路由對象) 即將要進入的目標 路由對象 to對象下面的屬性: path params query hash fullPath matched name meta(在matched下韧献,但是本例可以直接用)
from: (Route路由對象) 當前導航正要離開的路由
next: (Function函數(shù)) 一定要調用該方法來 resolve 這個鉤子。 調用方法:next(參數(shù)或者空) ***必須調用

next(無參數(shù)的時候): 進行管道中的下一個鉤子研叫,如果走到最后一個鉤子函數(shù)锤窑,那么 導航的狀態(tài)就是 confirmed (確認的)
next('/') 或者 next({ path: '/' }): 跳轉到一個不同的地址。當前的導航被中斷嚷炉,然后進行一個新的導航渊啰。
應用場景:可進行一些頁面跳轉前處理,例如判斷需要登錄的頁面進行攔截申屹,做登錄跳轉;嬷ぁ!

router.beforeEach((to, from, next) => {
    if (to.meta.requireAuth) {
        //判斷該路由是否需要登錄權限
        if (cookies('token')) {
            //通過封裝好的cookies讀取token哗讥,如果存在嚷那,name接下一步如果不存在,那跳轉回登錄頁
            next()//不要在next里面加"path:/",會陷入死循環(huán)
        }
        else {
            next({
                path: '/login',
                query: {redirect: to.fullPath}//將跳轉的路由path作為參數(shù)杆煞,登錄成功后跳轉到該路由
            })
        }
    }
    else {
        next()
    }
})

應用場景车酣,進入頁面登錄判斷、管理員權限判斷索绪、瀏覽器判斷

//使用鉤子函數(shù)對路由進行權限跳轉
router.beforeEach((to, from, next) => {
    const role = localStorage.getItem('ms_username');
    if(!role && to.path !== '/login'){
        next('/login');
    }else if(to.meta.permission){
        // 如果是管理員權限則可進入,這里只是簡單的模擬管理員權限而已
        role === 'admin' ? next() : next('/403');
    }else{
        // 簡單的判斷IE10及以下不進入富文本編輯器贫悄,該組件不兼容
        if(navigator.userAgent.indexOf('MSIE') > -1 && to.path === '/editor'){
            Vue.prototype.$alert('vue-quill-editor組件不兼容IE10及以下瀏覽器瑞驱,請使用更高版本的瀏覽器查看', '瀏覽器不兼容通知', {
                confirmButtonText: '確定'
            });
        }else{
            next();
        }
    }
})

模塊二:路由獨享的守衛(wèi)(路由內鉤子)

你可以在路由配置上直接定義 beforeEnter 守衛(wèi):

const router = new VueRouter({
  routes: [
    {
      path: '/foo',
      component: Foo,
      beforeEnter: (to, from, next) => {
        // ...
      }
    }
  ]

模塊三:組件內的守衛(wèi)(組件內鉤子)

1、beforeRouteEnter窄坦、beforeRouteUpdate唤反、beforeRouteLeave

const Foo = {
  template: `...`,
  beforeRouteEnter (to, from, next) {
    // 在渲染該組件的對應路由被 confirm 前調用
    // 不!能鸭津!獲取組件實例 `this`
    // 因為當鉤子執(zhí)行前彤侍,組件實例還沒被創(chuàng)建
  },
  beforeRouteUpdate (to, from, next) {
    // 在當前路由改變,但是該組件被復用時調用
    // 舉例來說逆趋,對于一個帶有動態(tài)參數(shù)的路徑 /foo/:id盏阶,在 /foo/1 和 /foo/2 之間跳轉的時候,
    // 由于會渲染同樣的 Foo 組件闻书,因此組件實例會被復用名斟。而這個鉤子就會在這個情況下被調用脑慧。
    // 可以訪問組件實例 `this`
  },
  beforeRouteLeave (to, from, next) {
    // 導航離開該組件的對應路由時調用
    // 可以訪問組件實例 `this`
  }
  1. 路由鉤子在實際開發(fā)中的應用場景

(一) 清除當前組件中的定時器

當一個組件中有一個定時器時, 在路由進行切換的時候, 可使用beforeRouteLeave將定時器進行清除, 以免占用內存:

beforeRouteLeave (to, from, next) {
  window.clearInterval(this.timer) //清除定時器
  next()
}

(二) 當頁面中有未關閉的窗口, 或未保存的內容時, 阻止頁面跳轉
如果頁面內有重要的信息需要用戶保存后才能進行跳轉, 或者有彈出框的情況. 應該阻止用戶跳轉,結合vuex狀態(tài)管理(dialogVisibility是否有保存)

beforeRouteLeave (to, from, next) {
 //判斷是否彈出框的狀態(tài)和保存信息與否
 if (this.dialogVisibility === true) {
    this.dialogVisibility = false //關閉彈出框
    next(false) //回到當前頁面, 阻止頁面跳轉
  }else if(this.saveMessage === false) {
    alert('請保存信息后退出!') //彈出警告
    next(false) //回到當前頁面, 阻止頁面跳轉
  }else {
    next() //否則允許跳轉
  }

(三) 保存相關內容到Vuex中或Session中
當用戶需要關閉頁面時, 可以將公用的信息保存到session或Vuex中

beforeRouteLeave (to, from, next) {
    localStorage.setItem(name, content); //保存到localStorage中
    next()
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末砰盐,一起剝皮案震驚了整個濱河市闷袒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌岩梳,老刑警劉巖囊骤,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異冀值,居然都是意外死亡也物,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門池摧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來焦除,“玉大人,你說我怎么就攤上這事作彤”炱牵” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵竭讳,是天一觀的道長创葡。 經常有香客問我,道長绢慢,這世上最難降的妖魔是什么灿渴? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮胰舆,結果婚禮上骚露,老公的妹妹穿的比我還像新娘。我一直安慰自己缚窿,他們只是感情好棘幸,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著倦零,像睡著了一般误续。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扫茅,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天蹋嵌,我揣著相機與錄音,去河邊找鬼葫隙。 笑死栽烂,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播愕鼓,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼钙态,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了菇晃?” 一聲冷哼從身側響起册倒,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎磺送,沒想到半個月后驻子,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡估灿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年崇呵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片馅袁。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡域慷,死狀恐怖,靈堂內的尸體忽然破棺而出汗销,到底是詐尸還是另有隱情犹褒,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布弛针,位于F島的核電站叠骑,受9級特大地震影響,放射性物質發(fā)生泄漏削茁。R本人自食惡果不足惜宙枷,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望茧跋。 院中可真熱鬧慰丛,春花似錦、人聲如沸瘾杭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽富寿。三九已至,卻和暖如春锣夹,著一層夾襖步出監(jiān)牢的瞬間页徐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工银萍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留变勇,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像搀绣,于是被迫代替她去往敵國和親飞袋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內容

  • 回憶: 我們知道链患,h5的history或者hash幫助我們解決了巧鸭,變化url跳轉頁面不發(fā)送請求,并且我們能監(jiān)聽到u...
    LoveBugs_King閱讀 3,648評論 0 5
  • 編程式導航 1 .用在可復用的路由視圖里面麻捻,比如所有的需要跳轉到一個文章具體內容的路由纲仍,每一次跳轉到新路由的時候,...
    skoll閱讀 652評論 0 1
  • 這是我第5篇簡書。 ??由于Vue在開發(fā)時對路由支持的不足明棍,于是官方補充了vue-router插件乡革。vue的單頁面...
    東西里閱讀 45,157評論 20 212
  • 一、vue-router實現(xiàn)原理 SPA(single page application):單一頁面應用程序摊腋,只有...
    walycode閱讀 1,049評論 1 3
  • 目錄 - 1.vue-router 動態(tài)路由匹配 - 2.router-link組件及其屬性 - 3.vue-ro...
    我跟你蔣閱讀 1,123評論 0 7