中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

關于Vue Router中路由守衛的應用及在全局導航守衛中檢查元字段的方法

發布時間:2020-09-20 09:34:38 來源:腳本之家 閱讀:278 作者:godDie 欄目:web開發

 #在切換路由時,組件會被復用,不過,這也意味著組件的生命周期鉤子不會再被調用。

   解決辦法有兩種,1簡單地 watch (監測變化) $route 對象:

const User = {
 template: '...',
 watch: {
  '$route' (to, from) {
   // 對路由變化作出響應...
  }
 }
}

    2.使用 2.2 中引入的 beforeRouteUpdate 導航守衛:

const User = {
 template: '...',
 beforeRouteUpdate (to, from, next) {
  // react to route changes...
  // don't forget to call next()
 }
}

#全局守衛

你可以使用 router.beforeEach 注冊一個全局前置守衛:

const router = new VueRouter({ ... })
router.beforeEach((to, from, next) => {
 // ...
})

•to: Route: 即將要進入的目標 路由對象

•from: Route: 當前導航正要離開的路由

•next: Function: 一定要調用該方法來 resolve 這個鉤子

#全局解析守衛

在 2.5.0+ 你可以用 router.beforeResolve 注冊一個全局守衛。這和 router.beforeEach 類似,區別是在導航被確認之前,同時在所有組件內守衛和異步路由組件被解析之后,解析守衛就被調用。

#全局后置鉤子

你也可以注冊全局后置鉤子,然而和守衛不同的是,這些鉤子不會接受 next 函數也不會改變導航本身:

router.afterEach((to, from) => {
 // ...
})

#路由獨享的守衛

你可以在路由配置上直接定義 beforeEnter 守衛

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

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

#組件內的守衛

你可以在路由組件內直接定義以下路由導航守衛:

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`
 }
}

beforeRouteEnter 守衛 不能 訪問 this,因為守衛在導航確認前被調用,因此即將登場的新組件還沒被創建。

不過,你可以通過傳一個回調給 next來訪問組件實例。在導航被確認的時候執行回調,并且把組件實例作為回調方法的參數。

export default {
  data(){
    return {
       num: 18
    }
  },
  beforeRouteEnter(to, from, next){
    next(vm=>{
      vm.num=22;
    })
  }
}

注意 beforeRouteEnter 是支持給 next 傳遞回調的唯一守衛。對于 beforeRouteUpdate 和 beforeRouteLeave 來說,this 已經可用了,所以不支持傳遞回調,因為沒有必要了

#完整的導航解析流程

1.導航被觸發。
2.在失活的組件里調用離開守衛。
3.調用全局的 beforeEach 守衛。
4.在重用的組件里調用 beforeRouteUpdate 守衛 (2.2+)。
5.在路由配置里調用 beforeEnter。
6.解析異步路由組件。
7.在被激活的組件里調用 beforeRouteEnter。
8.調用全局的 beforeResolve 守衛 (2.5+)。
9.導航被確認。
10.調用全局的 afterEach 鉤子。
11.觸發 DOM 更新。
12.用創建好的實例調用 beforeRouteEnter 守衛中傳給 next 的回調函數。

#在全局導航守衛中檢查元字段

router.beforeEach((to, from, next) => {
 if (to.matched.some(record => record.meta.requiresAuth)) {
  //如果路由中有meta的requireAuth,且為true,就不進行登錄驗證,否則進行登錄驗證
  if (!auth.loggedIn()) {
   next({
    path: '/login',
    query: { redirect: to.fullPath }
   })
  } else {
   next()
  }
 } else {
  next() // 確保一定要調用 next()
 }
})

一個路由匹配到的所有路由記錄會暴露為 $route 對象 (還有在導航守衛中的路由對象) 的 $route.matched 數組。因此,我們需要遍歷 $route.matched 來檢查路由記錄中的 meta 字段。

  注:1、meta 字段就是路由元信息字段,requiresAuth 是自己起的字段名稱,用來標記這個路由信息是否需要檢測,true 表示要檢測,false 表示不需要檢測(這個名稱隨便起,比如我自己的就起的 requiresId,建議起個有意義的名稱)

  2、if (to.matched.some(record => record.meta.requiresAuth) ),如果對這類寫法不熟悉,可以去看看es6的箭頭函數,這句話就是返回遍歷的某個路由對象,我們定義為為record,檢測這個對象是否擁有meta這個對象,如果有meta這個對象,檢測它的meta對象是不是有requiresAuth這個屬性,且為true,如果滿足上述條件,就確定了是這個/foo/bar路由。

  3、some() 方法測試數組中的某些元素是否通過了指定函數的測試。語法:arr.some(callback[, thisArg]);

    some 為數組中的每一個元素執行一次 callback 函數,直到找到一個使得 callback 返回一個“真值”(即可轉換為布爾值 true 的值)。如果找到了這樣一個值,some 將會立即返回 true。否則,some 返回 false。callback 只會在那些”有值“的索引上被調用,不會在那些被刪除或從來未被賦值的索引上調用。

     callback 被調用時傳入三個參數:元素的值,元素的索引,被遍歷的數組。

  4、vue-router路由元信息說白了就是通過meta對象中的一些屬性來判斷當前路由是否需要進一步處理,如果需要處理,按照自己想要的效果進行處理即可!

總結

以上所述是小編給大家介紹的關于Vue Router中路由守衛的應用及在全局導航守衛中檢查元字段的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

廉江市| 鸡泽县| 都安| 城固县| 兴义市| 平昌县| 曲水县| 丹棱县| 齐齐哈尔市| 阳高县| 铜川市| 商水县| 门源| 名山县| 五大连池市| 都安| 黄梅县| 河东区| 汉源县| 独山县| 大厂| 石家庄市| 仙居县| 那坡县| 资阳市| 恩平市| 合山市| 凤凰县| 武城县| 巨鹿县| 巴里| 南召县| 平顶山市| 长沙县| 阿拉善左旗| 宜丰县| 牡丹江市| 隆尧县| 驻马店市| 奈曼旗| 威信县|