最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
當前位置: 首頁 - 科技 - 知識百科 - 正文

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

來源:懂視網 責編:小采 時間:2020-11-27 22:02:47
文檔

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

關于Vue Router中路由守衛的應用及在全局導航守衛中檢查元字段的方法: #在切換路由時,組件會被復用,不過,這也意味著組件的生命周期鉤子不會再被調用。 解決辦法有兩種,1簡單地 watch (監測變化) $route 對象: const User = { template: '...', watch: { '$route' (to, from) { // 對路由變化
推薦度:
導讀關于Vue Router中路由守衛的應用及在全局導航守衛中檢查元字段的方法: #在切換路由時,組件會被復用,不過,這也意味著組件的生命周期鉤子不會再被調用。 解決辦法有兩種,1簡單地 watch (監測變化) $route 對象: const User = { template: '...', watch: { '$route' (to, from) { // 對路由變化

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

   解決辦法有兩種,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中路由守衛的應用及在全局導航守衛中檢查元字段的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

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

關于Vue Router中路由守衛的應用及在全局導航守衛中檢查元字段的方法: #在切換路由時,組件會被復用,不過,這也意味著組件的生命周期鉤子不會再被調用。 解決辦法有兩種,1簡單地 watch (監測變化) $route 對象: const User = { template: '...', watch: { '$route' (to, from) { // 對路由變化
推薦度:
標簽: VUE router 關于vue
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
国产精品久久久久精品…-国产精品可乐视频最新-亚洲欧美重口味在线-欧美va免费在线观看