vue之router鉤子函數

模塊一:全局導航鉤子函數vue

一、vue router.beforeEach(全局前置守衛)vuex

beforeEach的鉤子函數,它是一個全局的before 鉤子函數, (before each)意思是在 每次每個路由改變的時候都得執行一遍。瀏覽器

它的三個參數:cookie

to: (Route路由對象) 即將要進入的目標 路由對象 to對象下面的屬性: path params query hash fullPath matched name meta(在matched下,可是本例能夠直接用)session

from: (Route路由對象) 當前導航正要離開的路由編輯器

next: (Function函數) 必定要調用該方法來 resolve 這個鉤子。 調用方法:next(參數或者空) ***必須調用函數

 

next(無參數的時候): 進行管道中的下一個鉤子,若是走到最後一個鉤子函數,那麼 導航的狀態就是 confirmed (確認的)ui

next('/') 或者 next({ path: '/' }): 跳轉到一個不一樣的地址。當前的導航被中斷,而後進行一個新的導航。this

應用場景:可進行一些頁面跳轉前處理,例如判斷須要登陸的頁面進行攔截,作登陸跳轉!!spa

router.beforeEach((to, from, next) => {
    if (to.meta.requireAuth) {
        //判斷該路由是否須要登陸權限
        if (cookies('token')) {
            //經過封裝好的cookies讀取token,若是存在,name接下一步若是不存在,那跳轉回登陸頁
            next()//不要在next裏面加"path:/",會陷入死循環
        }
        else {
            next({
                path: '/login',
                query: {redirect: to.fullPath}//將跳轉的路由path做爲參數,登陸成功後跳轉到該路由
            })
        }
    }
    else {
        next()
    }
})

應用場景,進入頁面登陸判斷、管理員權限判斷、瀏覽器判斷

//使用鉤子函數對路由進行權限跳轉
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();
        }
    }
})

 

二、vue router.afterEach(全局後置守衛)

router.beforeEach 是頁面加載以前,相反router.afterEach是頁面加載以後 

 

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

你能夠在路由配置上直接定義 beforeEnter 守衛:

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

這些守衛與全局前置守衛的方法參數是同樣的。

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

一、beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave

 

const Foo = {
  template: `...`,
  beforeRouteEnter (to, from, next) {
    // 在渲染該組件的對應路由被 confirm 前調用
    // 不!能!獲取組件實例 `this`
    // 由於當鉤子執行前,組件實例還沒被建立
  },
  beforeRouteUpdate (to, from, next) {
    // 在當前路由改變,可是該組件被複用時調用
    // 舉例來講,對於一個帶有動態參數的路徑 /foo/:id,在 /foo/1 和 /foo/2 之間跳轉的時候,
    // 因爲會渲染一樣的 Foo 組件,所以組件實例會被複用。而這個鉤子就會在這個狀況下被調用。
    // 能夠訪問組件實例 `this`
  },
  beforeRouteLeave (to, from, next) {
    // 導航離開該組件的對應路由時調用
    // 能夠訪問組件實例 `this`
}

2. 路由鉤子在實際開發中的應用場景

 

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

 

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

 

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

 

(二) 當頁面中有未關閉的窗口, 或未保存的內容時, 阻止頁面跳轉

若是頁面內有重要的信息須要用戶保存後才能進行跳轉, 或者有彈出框的狀況. 應該阻止用戶跳轉,結合vuex狀態管理(dialogVisibility是否有保存)

 beforeRouteLeave (to, from, next) {
 //判斷是否彈出框的狀態和保存信息與否
 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()
}
相關文章
相關標籤/搜索