(四十七)Vue Router之路由守衛

文章目錄

  • 概念
  • 全局路由守衛
    • 全局前置守衛
    • 全局解析守衛
    • 全局后置路由守衛
  • 獨享路由守衛
  • 組件內的守衛
    • beforeRouteEnter
    • beforeRouteUpdate
    • beforeRouteLeave
  • 完整的導航解析流程

上一篇:(四十六)Vue Router組件所獨有的兩個鉤子activate、deactivated

概念

路由守衛是在前端應用中用于控制和管理路由導航的機制。它們允許開發人員在路由導航事件發生之前或之后執行一些邏輯。

路由守衛可以用于實現以下功能:

  • 身份驗證:通過在路由導航之前檢查用戶的身份驗證狀態,可以防止未經授權的用戶訪問受保護的頁面。如果用戶未登錄或沒有足夠的權限,可以重定向到登錄頁面或顯示適當的提示信息。
  • 授權:除了身份驗證外,路由守衛還可以檢查用戶是否具有足夠的權限訪問某個頁面或執行某個操作。如果用戶權限不足,可以阻止導航或采取其他適當的措施。
  • 數據預加載:在加載某個路由之前,可以使用路由守衛來預加載所需的數據。這可以提高用戶體驗,減少頁面加載時間,并確保頁面所需的數據在渲染之前已經準備好。

全局路由守衛

全局路由守衛是應用于整個路由系統的守衛機制。它們會在每次路由導航事件發生時觸發,并允許開發人員執行一些全局級別的邏輯。

每個守衛方法接收三個參數:

  • to: Route:即將要進入的目標 路由對象
  • from: Route:當前導航正要離開的路由
  • next: Function::一定要調用該方法來 resolve 這個鉤子。執行效果依賴 next 方法的調用參數。
    • next()::進行管道中的下一個鉤子。如果全部鉤子執行完了,則導航的狀態就是 confirmed (確認的)。
    • next(false): 中斷當前的導航。如果瀏覽器的 URL 改變了 (可能是用戶手動或者瀏覽器后退按鈕),那么 URL 地址會重置到from 路由對應的地址。
    • next('/') 或者 next({ path: '/' }): 跳轉到一個不同的地址。當前的導航被中斷,然后進行一個新的導航。你可以向 next 傳遞任意位置對象,且允許設置諸如 replace: true、name: ‘home’ 之類的選項以及任何用在 router-link 的 to prop 或 router.push 中的選項。
    • next(error)::(2.4.0+) 如果傳入 next 的參數是一個 Error 實例,則導航會被終止且該錯誤會被傳遞給 router.onError() 注冊過的回調。

確保 next 函數在任何給定的導航守衛中都被嚴格調用一次。它可以出現多于一次,但是只能在所有的邏輯路徑都不重疊的情況下,否則鉤子永遠都不會被解析或報錯。
這里有一個在用戶未能驗證身份時重定向到 /login 的示例:

// BAD
router.beforeEach((to, from, next) => {if (to.name !== 'Login' && !isAuthenticated) next({ name: 'Login' })// 如果用戶未能驗證身份,則 `next` 會被調用兩次next()
})
// GOOD
router.beforeEach((to, from, next) => {if (to.name !== 'Login' && !isAuthenticated) next({ name: 'Login' })else next()
})

全局路由守衛分類:

  • 全局前置路由守衛
  • 全局解析路由守衛
  • 全局后置路由守衛

執行順序:

  • 全局前置路由守衛 (beforeEach)按照注冊順序執行。
  • 解析路由守衛 (beforeResolve)按照注冊順序執行。
  • 路由組件實例化和渲染。
  • 全局后置路由守衛 (afterEach)按照注冊順序執行。

全局前置守衛

當一個導航觸發時,初始化的時候和每次路由切換之前調用,全局前置守衛按照創建順序調用。守衛是異步解析執行,此時導航在所有守衛 resolve 完之前一直處于等待中
你可以使用 router.beforeEach 注冊一個全局前置守衛:

const router = new VueRouter({ ... })//全局前置路由守衛---初始化的時候和每次路由切換之前調用
router.beforeEach((to, from, next) => {// ...
})

全局解析守衛

全局解析守衛是一個在路由導航之前觸發的守衛機制,用于在路由進入組件之前預加載所需的數據。它可以在整個路由系統中應用,確保數據在組件渲染之前已經準備好。

const router = new VueRouter({ ... })router.beforeResolve((to, from, next) => {// 在路由導航之前觸發,可以執行解析邏輯或其他操作// 在這里可以預加載數據或執行其他全局級別的處理next(); // 確保繼續路由導航
});

全局后置路由守衛

全局后置路由守衛是Vue Router中的一種路由守衛,用于在路由導航完成后執行一些操作。它可以用于記錄頁面訪問日志、執行統計分析或其他需要在路由導航后進行的全局級別處理。

和其他守衛不同的是,這些鉤子不會接受 next 函數也不會改變導航本身:

const router = new VueRouter({ ... })//全局后置路由守衛---初始化的時候和每次路由切換之后被調用
router.afterEach((to, from) => {// 在路由導航完成后觸發,可以執行一些操作// 在這里可以記錄頁面訪問日志、執行統計分析或其他全局級別的處理
});

獨享路由守衛

在Vue Router中,你可以使用全局獨享路由守衛來為特定的路由配置獨立的守衛。全局獨享路由守衛提供了更細粒度的控制,可以在特定路由上執行一些操作或驗證邏輯。全局獨享路由守衛可以通過在路由配置中的beforeEnter字段中定義一個守衛函數來實現。

const router = new VueRouter({routes: [{path: '/xxx',component: xxx,beforeEnter: (to, from, next) => {// 在進入路由之前觸發,可以執行一些操作或驗證邏輯// 在這里可以進行身份驗證或其他特定路由級別的處理next(); // 確保繼續路由導航}},// 其他路由配置...]
});

組件內的守衛

可以在組件內部定義路由守衛,以便在特定組件中執行相關的操作或驗證邏輯。這種類型的守衛被稱為組件內的路由守衛(Component Guard)。Vue Router提供了以下幾種組件內的路由守衛:

  • beforeRouteEnter:在進入路由之前被調用。它在組件實例被創建之前被調用,因此在該守衛中無法直接訪問組件實例this
  • beforeRouteUpdate(2.2 新增):在當前路由改變,但是該組件被復用時調用。它可以用于響應路由參數的變化,以及在組件復用時執行一些邏輯。可以訪問組件實例 this
  • beforeRouteLeave:在離開當前路由之前被調用。可以用于確認是否離開當前頁面、保存表單等操作。可以訪問組件實例 this

beforeRouteEnter

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

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

beforeRouteEnter (to, from, next) {next(vm => {// 通過 `vm` 訪問組件實例})
}

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

beforeRouteUpdate

在當前路由改變,但是該組件被復用時調用,舉例來說,對于一個帶有動態參數的路徑 /foo/:id,在 /foo/1 和 /foo/2 之間跳轉的時候,由于會渲染同樣的 Foo 組件,因此組件實例會被復用。而這個鉤子就會在這個情況下被調用。

beforeRouteUpdate (to, from, next) {// 可以使用 `this`
}

beforeRouteLeave

導航離開該組件的對應路由時調用

beforeRouteLeave(to, from, next) {// 可以訪問組件實例 `this`
}

完整的導航解析流程

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/38771.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38771.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/38771.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VLAN原理與配置

AUTHOR :閆小雨 DATE:2024-04-28 目錄 VLAN的三種端口類型 VLAN原理 什么是VLAN 為什么使用VLAN VLAN的基本原理 VLAN標簽 VLAN標簽各字段含義如下: VLAN的劃分方式 VLAN的劃分包括如下5種方法: VLAN的接口鏈路類型 創建V…

Android system.img掛載和解除掛載

Android system.img掛載和解除掛載 解包后的super.img,里面最重要的是system.img文件,如何對system.img進行掛載和解除掛載是需要掌握的能力 基礎知識 system.img、vendor.img 都存在兩種格式raw,sparse ,在ubuntu命令窗口下執行下執行&am…

深度學習之生成對抗網絡 BigGAN

BigGAN(Big Generative Adversarial Networks)是生成對抗網絡(GAN)的一種變體,專注于生成高質量、大尺寸的圖像。BigGAN 是由 DeepMind 的研究人員于 2018 年提出的。其核心思想是通過增加模型的規模(更深的網絡和更多的參數)來提高生成圖像的質量,同時引入一些新的技術…

便簽 Pro(Mac 智能便簽工具)專業版怎么樣,值得購買嗎?

使用 Mac 的小伙伴平時都是怎么記錄工作生活中的碎片信息?用聊天軟件,還是系統備忘錄呢? 實際體驗下來,其實都難以稱得上好用。 趕緊來了解一下 Mac 多彩思維速記工具便簽 Pro!擁有智能邊框大小、iCloud 同步、歷史記…

矩陣置零解題

給定一個 m x n 的矩陣,如果一個元素為 0 ,則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 示例 1: 輸入:matrix [[1,1,1],[1,0,1],[1,1,1]] 輸出:[[1,0,1],[0,0,0],[1,0,1]]示例 2: 輸入&…

VUE3解決跨域問題

本文基于vue3 vite element-plus pnpm 報錯:**** has been blocked by CORS policy: No Access-Control-Allow-Origin header is present on the requested resource. 原因:前端不能直接訪問其他IP,需要用vite.config.ts &#xff0…

onvif 基本概念

media_server、device_server和event_server是三個重要的服務。 1. media_server 功能:media_server服務主要負責處理媒體流相關的請求,包括視頻和音頻流的傳輸、控制等。實現:該服務通常使用RTSP(Real Time Streaming Protocol…

API-本地存儲

學習目標: 掌握本地存儲 學習內容: 本地存儲介紹本地存儲分類存儲復雜數據類型 本地存儲介紹: 以前我們頁面寫的數據一刷新頁面就沒有了,是不是? 隨著互聯網的快速發展,基于網頁的應用越來越普遍,同時也…

算法基礎入門 - 2.棧、隊列、鏈表

文章目錄 算法基礎入門第二章 棧、隊列、鏈表2.1 隊列2.2 棧2.3 紙牌游戲2.4 鏈表如何建立鏈表?1.我們需要一個頭指針(head)指向鏈表的初始。鏈表還沒建立時頭指針head為空2.建立第一個結點3.設置剛創建的這個結點的數據域(左半)和指針域(右半)4.設置頭指針,頭指針可方便…

【鴻蒙學習筆記】運算符

官方文檔&#xff1a;ArkTS語言介紹 目錄標題 賦值運算符比較運算符一元運算符&#xff1a;自增自減運算符二元運算符位運算符邏輯運算符 賦值運算符 運算符解釋解釋賦值運算符x x y加-x x - y減*x x * y乘/x x / y除%x x % y取余<<x x << y按位左移>&…

問題-小技巧-專業版Win11怎么啟動電腦的休眠模式?

專業版Win11怎么啟動電腦的休眠模式&#xff1f; powercfg -a powercfg -hibernate on 啟用管理員面板依次輸入上述命令就可以了。

寵物醫院管理系統-計算機畢業設計源碼07221

目 錄 1 緒論 1.1 選題背景和意義 1.2國內外研究現狀 1.3論文結構與章節安排 2 寵物醫院管理系統系統分析 2.1 可行性分析 2.1.1技術可行性分析 2.1.2 操作可行性分析 2.1.3 法律可行性分析 2.2 系統功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系統用例分…

【python爬蟲】總結反反爬的技巧

1. 當請求失敗時重復請求 def get_url(url):try:response requests.get(url, timeout10) # 超時設置為10秒except:for i in range(10): # 循環去請求網站response requests.get(url, proxiesproxies, timeout20)if response.status_code 200:breakreturn response2. 適當…

C++ 教程 - 09 多線程處理

文章目錄 thread標準庫pthread庫 thread標準庫 C 11 后添加了新的標準線程庫 std::thread 類&#xff0c;需引入頭文件<thread>聲明即創建線程對象&#xff0c;如 thread th1&#xff1b; 調用無參構造&#xff0c;生成一個空的線程對象&#xff1b;thread th(callable&…

VL31N BAPI:GN_DELIVERY_CREATE創建內向交貨單同時批次拆分

翻到之前寫的測試代碼&#xff0c;記錄一下&#xff0c;用于創建DN的同時就進行批次拆分&#xff0c;不需要再調用變更的BAPI再去修改一次。 REPORT ZTEST_VL31N_BATCH_SPLIT.DATA:GS_VBSK_I TYPE VBSK, "構造:販売伝票ヘッダINGS…

2023-2024華為ICT大賽中國區 實踐賽云賽道 全國總決賽 理論部分真題

Part 1 大數據模塊(3題)&#xff1a; 1、以下關于特征選擇中的互信息法描述中&#xff0c;理解正確的是哪些?(多選題) A.互信息法是從信息熵的角度分析特征和輸出值之間的關系評分 B.在Python工具的sklearn模塊中&#xff0c;可使用mutual_info_classif(分類)和mutual_info…

AI智能在Type-C領域的應用

隨著科技的飛速發展&#xff0c;Type-C接口憑借其卓越的性能和廣泛的應用場景&#xff0c;已成為現代電子設備中不可或缺的一部分。而AI智能技術的興起&#xff0c;為Type-C領域帶來了革命性的變革&#xff0c;推動了其功能的進一步完善和應用領域的拓展。本文將探討AI智能在Ty…

用技術手段有效應對CC攻擊

在網絡安全領域&#xff0c;CC攻擊&#xff08;Challenge Collapsar&#xff0c;即HTTP Flood攻擊的一種&#xff09;是一種常見的分布式拒絕服務&#xff08;DDoS&#xff09;攻擊手段&#xff0c;它通過大量合法的HTTP請求耗盡服務器資源&#xff0c;導致正常用戶訪問緩慢甚至…

【cocos2dx】【c++】【游戲開發】舊題新說,計算兩個日期相差幾天,在指定的天數彈出相應的彈窗

【cocos2dx】【c】計算兩個日期相差幾天&#xff0c;在指定的天數彈出相應的彈窗 設備/引擎&#xff1a;Mac&#xff08;11.6&#xff09;/Mac Mini 開發工具&#xff1a;Xcode&#xff08;15.0.1&#xff09; 開發需求&#xff1a;計算兩個日期相差幾天&#xff0c;在指定的…

中文翻譯老撾語只推薦一個神器《老撾語翻譯通》App,老撾語口語發音練習,支持老撾文OCR識別提取文字!

出國旅游去探索東南亞的神秘國家&#xff1a;老撾&#xff0c;不會老撾語怎么辦&#xff1f;不用怕&#xff0c;下載《老撾語翻譯通》App幫助你把中文翻譯成老撾語。 功能亮點&#xff1a; 實時翻譯&#xff1a;實時把中文翻譯成老撾語&#xff0c;老撾語單詞或者句子均可均可…