【Vue Router】路由模式、懶加載、守衛、權限、緩存

前言

Vue Router 是 Vue 生態中處理頁面跳轉的核心工具,它解決了單頁應用中 URL 管理、組件切換、狀態維護等關鍵問題,同時提供了豐富的功能(如動態路由、嵌套路由、路由守衛)。除了經常用到的路由配置以外,我們還需了解以下幾點。

1. Vue 路由模式

Vue Router 支持兩種路由模式:

模式原理特點啟用方式
Hash 模式使用 URL hash (#) 模擬完整 URL http://example.com/#/home兼容性好(支持 IE9) 無需服務器配置mode: 'hash' (默認)
History 模式基于 HTML5 History API http://example.com/homeURL 更美觀 需要服務器端支持mode: 'history'

服務器配置示例 (History 模式):

# Nginx 配置
location / {try_files $uri $uri/ /index.html;
}

2. 路由懶加載

實現組件按需加載,提升首屏性能。

實現方式

const router = new VueRouter({routes: [// 魔法注釋:webpackChunkName 定義分包名稱{ path: '/dashboard',component: () => import(/* webpackChunkName: "dashboard"*/'./views/Dashboard.vue')},{path: '/user/:id',component: () => import(/* webpackChunkName: "user" */ './views/UserProfile.vue')}]
})

優化效果

  • 首屏加載時間減少 30-50%
  • 按路由拆分 chunk 文件
  • 支持預加載:<link rel="prefetch">

3. 路由緩存

使用 <keep-alive> 緩存組件狀態:

<template><div id="app"><!-- 緩存帶有 meta.keepAlive 的路由 --><keep-alive :include="cachedViews"><router-view v-if="$route.meta.keepAlive"></router-view></keep-alive><!-- 不緩存的路由 --><router-view v-if="!$route.meta.keepAlive"></router-view></div>
</template><script>
export default {computed: {cachedViews() {return this.$store.state.cachedRoutes}}
}
</script>

路由配置

{path: '/user/:id',component: UserDetails,meta: { keepAlive: true, // 啟用緩存scrollPos: true  // 記錄滾動位置}
}

可通過屬性控制緩存范圍:

  • include:僅緩存名稱匹配的組件(組件需定義 name 屬性)。
  • exclude:不緩存名稱匹配的組件。
  • max:最多緩存的組件實例數量。

示例:

<keep-alive include="Home,About" :max="10"><router-view />
</keep-alive>

被緩存的組件會觸發 activated(激活時)和 deactivated(失活時)生命周期鉤子,替代 mountedunmounted

4. 路由守衛

守衛類型

// 1. 全局前置守衛
router.beforeEach((to, from, next) => {if (to.meta.requiresAuth && !isLoggedIn()) next('/login')else next()
})// 2. 路由獨享守衛
{path: '/admin',beforeEnter: (to, from, next) => {checkAdminPermission() ? next() : next('/403')}
}// 3. 組件內守衛
const UserProfile = {beforeRouteEnter(to, from, next) {// 不能訪問 thisnext(vm => console.log(vm.user)) // 通過回調訪問組件實例},beforeRouteUpdate(to, from, next) {// 路由參數變化時觸發this.fetchData(to.params.id)next()},beforeRouteLeave(to, from, next) {// 離開確認window.onbeforeunload = nullnext()}
}

1.全局路由

Route.beforeEeach 任意路由跳轉前觸發

Route.beforeResolve 導航確認前觸發

Route.afterEach 導航完成后觸發

2.路由獨享守衛

beforeEnter 在路由配置上定義,進入路由時觸發

3.組件內守衛

beforeRouteEnter 渲染組件路由被驗證前調用(適合做進入前的權限驗證,不能訪問this)

beforeRouteUpdate 當組件路由改變,組件復用時候調用(適合在路由參數變化時重新加載數據

beforeRouteLeave 導航離開組件的對應路由時調用(適合做離開前的確認(如未保存的表單)

導航解析流程:

  • 1.觸發導航 → 生成目標路由
  • 2.在失活的組件里調用(beforeRouteLeave
  • 3.執行 全局前置守衛beforeEach
  • 4.在重用的組件里調用beforeRouteUpdate
  • 5.執行 路由獨享守衛beforeEnter
  • 6.執行 組件內前置守衛beforeRouteEnter
  • 7.解析異步路由組件:如 () => import('./User.vue')
  • 8.執行 組件內更新守衛beforeRouteUpdate,如適用)
  • 9.執行 組件內離開守衛beforeRouteLeave,如適用)
  • 10.執行 全局解析守衛beforeResolve
  • 11.確認導航,更新 URL 和路由記錄
  • 12.執行 全局后置鉤子afterEach
  • 13.Dom更新:銷毀舊組件,創建并渲染新組件 → 完成導航

通過這個流程,Vue Router 實現了對路由導航的精細控制,結合不同類型的守衛可以滿足權限驗證、數據預加載、離開確認等多種業務需求。

5. 路由與后端菜單結合

動態路由工作流
在這里插入圖片描述

實現代碼

// 1. 定義基礎路由(無需權限)
const constantRoutes = [{ path: '/login', component: Login },{ path: '/404', component: NotFound }
]// 2. 從后端獲取菜單
async function initRoutes() {const menuData = await axios.get('/api/user/menus')const dynamicRoutes = generateRoutes(menuData)// 3. 動態添加路由dynamicRoutes.forEach(route => router.addRoute(route))// 4. 添加404捕獲router.addRoute({ path: '*', redirect: '/404' })
}// 菜單轉換函數
function generateRoutes(menuData) {return menuData.map(menu => ({path: menu.path,component: () => import(`@/views/${menu.component}`),meta: { title: menu.title, icon: menu.icon },children: menu.children ? generateRoutes(menu.children) : []}))
}

6. 路由權限控制

完整權限方案

// 權限檢查函數
function hasPermission(route, roles) {if (route.meta?.roles) {return roles.some(role => route.meta.roles.includes(role))}return true // 無meta.roles則公開訪問
}// 路由過濾
function filterRoutes(routes, roles) {return routes.filter(route => {if (hasPermission(route, roles)) {if (route.children) {route.children = filterRoutes(route.children, roles)}return true}return false})
}// 全局前置守衛
router.beforeEach(async (to, from, next) => {// 1. 獲取用戶角色const roles = store.getters.roles || []// 2. 白名單檢查if (whiteList.includes(to.path)) return next()// 3. 未登錄重定向if (!roles.length) return next(`/login?redirect=${to.path}`)// 4. 已登錄但未初始化路由if (!store.getters.routesLoaded) {await initDynamicRoutes(roles) // 動態添加路由return next({ ...to, replace: true })}// 5. 檢查目標路由權限if (!hasPermission(to, roles)) return next('/403')next()
})

按鈕級權限控制

<template><button v-permission="'user:create'">添加用戶</button>
</template>
// 權限指令
Vue.directive('permission', {inserted(el, binding) {const { value } = bindingconst permissions = store.getters.permissionsif (value && !permissions.includes(value)) {el.parentNode?.removeChild(el)}}
})

最佳實踐總結

  1. 路由設計
    • 公共路由使用靜態注冊
    • 權限路由使用動態注冊
    • 路由元信息存儲權限標識
  2. 性能優化
    • 路由懶加載 + webpack 分包
    • 滾動行為恢復
    • 路由組件復用
  3. 安全控制
    • 前端路由權限校驗
    • 后端接口二次驗證
    • 按鈕級權限控制
  4. 錯誤處理
    • 統一404處理
    • 403無權限頁面
    • 路由切換錯誤捕獲
// 錯誤捕獲
router.onError(error => {console.error('路由錯誤:', error)if (/ChunkLoadError/.test(error.message)) {window.location.reload() // 重新加載解決chunk加載失敗}
})

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

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

相關文章

Linux epoll 實現詳解 (fs/eventpoll.c)

核心數據結構分析 1. struct eventpoll (epoll 實例核心結構) c struct eventpoll {struct mutex mtx; // 保護 epoll 結構的互斥鎖wait_queue_head_t wq; // epoll_wait() 使用的等待隊列wait_queue_head_t poll_wait; // 文件 poll() 使用的等待隊列struc…

【牛客刷題】小紅的項鏈(字節跳動面試題)

文章目錄 一、題目介紹 1.1 輸入描述 1.2 輸出描述 1.3 示例 二、算法設計思路 三、流程圖 四、題解實現 五、復雜度分析 六、關鍵算法知識點 一、題目介紹 原題鏈接:https://www.nowcoder.com/practice/3da065cab096478eb603bbfca5af8b02 小紅將 n n n個珠子排成一排,然后…

【Html網頁模板】HTML炫酷星空(一閃一閃亮晶晶)

文章目錄專欄導讀功能預覽快速開始核心實現拆解1. 背景與基礎布局2. 背景層靜態星空&#xff08;輕微閃爍&#xff09;3. 前景層“亮晶晶”的閃爍小星星4. 交互與動效5. 行星裝飾可配置項與個性化建議初始化順序&#xff08;入口&#xff09;源碼結語專欄導讀 &#x1f525;&am…

第一天-CAN Signal信號的Multiplexor多路復用在DBC中實現

&#x1f680; CAN總線的“變形金剛術”&#xff1a;Multiplexor多路復用信號深度揭秘在汽車電子江湖中&#xff0c;當數百個ECU爭相發送數據時&#xff0c;如何讓一條CAN報文像"變形金剛"一樣自由切換形態&#xff1f;Multiplexor&#xff08;多路復用&#xff09;技…

Code Exercising Day 10 of “Code Ideas Record“:StackQueue part02

文章目錄【150. Evaluate Reverse Polish Notation】【239. Sliding Window Maximum】【347. Top K Frequent Elements】【150. Evaluate Reverse Polish Notation】 Problem Link Approach: Use a stack. Push numbers onto the stack; when encountering an operator, pop t…

系統架構設計師備考之架構設計高級知識

1.系統架構設計基礎知識1.1.軟件架構概念軟件架構定義軟件架構&#xff08;Software Architecture&#xff09;或稱軟件體系結構&#xff0c;是指系統的一個或者多個結構&#xff0c;這些結構包括軟件的構件&#xff08;可能是程序模塊、類或者是中間件&#xff09;、構件的外部…

PWM波的頻譜分析及matlab 驗證[電路原理]

你知道嗎&#xff1f;pwm可以制作adc模塊哦&#xff01;這樣普通的gpio也能實現adc功能了。 我們嵌入式日常接觸的pwm波&#xff0c;你真的了解他嗎&#xff1f; 只有知道PWM的頻譜是怎么樣的&#xff0c;才能設計合適的濾波器&#xff0c;下面我們一起從底層數學原理來推導PWM…

相機、鏡頭參數詳解以及相關計算公式

一、工業相機參數 1、分辨率 相機每次采集圖像的像素點數&#xff0c;也是指這個相機總共有多少個感光晶片。在采集圖像時&#xff0c;相機的分辨率對檢測精度有很大的影響&#xff0c;在對同樣大的視場成像時&#xff0c;分辨率越高&#xff0c;對細節的展示越明顯。 相機像素…

通信中間件 Fast DDS(一) :編譯、安裝和測試

目錄 1.簡介 2.Windows編譯、安裝和測試 2.1.編譯環境準備 2.2.編譯安裝 2.2.1.安裝FastCDR 2.2.2.安裝Foonathan Memory 2.2.3.安裝FastDDS 2.3.驗證安裝 3.Linux編譯、安裝和測試 3.1.編譯環境準備 3.2.編譯安裝 3.2.1.安裝FastCDR 3.2.2.安裝Foonathan M…

NI USRP X410 無線電上的雷達目標仿真

此示例展示如何在 NI? USRP? 無線電的 FPGA 上部署雷達目標仿真算法。 介紹 在本例中&#xff0c;您將從 Simulink 模型入手&#xff0c;該模型可模擬最多四個雷達目標響應。您將按照分步指南&#xff0c;在 Simulink 中從該模型生成比特流&#xff0c;并使用生成的 MATLAB 主…

PyTorch 深度學習實戰教程-番外篇04:卷積層詳解與實戰指南

標簽&#xff1a;# 深度學習 #人工智能 #神經網絡 #PyTorch #卷積神經網絡 相關文章&#xff1a; 《Pytorch深度學習框架實戰教程01》 《Pytorch深度學習框架實戰教程02&#xff1a;開發環境部署》 《Pytorch深度學習框架實戰教程03&#xff1a;Tensor 的創建、屬性、操作與…

LeetCode 面試經典 150_數組/字符串_分發糖果(15_135_C++_困難)(貪心算法)

LeetCode 面試經典 150_數組/字符串_分發糖果&#xff08;15_135_C_困難&#xff09;題目描述&#xff1a;輸入輸出樣例&#xff1a;題解&#xff1a;解題思路&#xff1a;思路一&#xff08;貪心算法&#xff09;&#xff1a;代碼實現代碼實現&#xff08;思路一&#xff08;貪…

配置timer控制 IO的輸出(STC8)

使用STC8的Timer控制IO輸出 STC8系列單片機具有多個定時器&#xff0c;可以用于精確控制IO口的輸出狀態。以下是使用Timer0和Timer1控制IO輸出的方法。 初始化Timer0 配置Timer0為16位自動重裝模式&#xff0c;用于周期性控制IO輸出&#xff1a; /************************ 定時…

【Python練習】086. 編寫一個函數,實現簡單的DHCP服務器功能

086. 編寫一個函數,實現簡單的DHCP服務器功能 086. 編寫一個函數,實現簡單的DHCP服務器功能 安裝依賴庫 示例代碼 代碼說明 示例輸出 注意事項 擴展功能 DHCP服務器功能實現方法 依賴庫安裝 基本功能實現 功能說明 運行方法 注意事項 擴展功能 086. 編寫一個函數,實現簡單的…

生產環境Tomcat運行一段時間后,如何測試其性能是否滿足后續使用

要測試生產環境中已運行一段時間的Tomcat性能是否滿足后續使用需求&#xff0c;需從基礎監控、負載壓力測試、配置合理性校驗、穩定性驗證等多維度入手&#xff0c;結合工具和實際業務場景定位瓶頸&#xff0c;確保其能應對未來可能的流量增長。以下是具體方法和步驟&#xff1…

Qt中的設計模式:經典的MVC,MVP和MVVM

Qt中的設計模式&#xff1a;經典的MVC&#xff0c;MVP和MVVM 前言 ? 筆者這里最近正在研究經典的三大 Model/View 框架&#xff0c;不得不說&#xff0c;我先前的確寫過Qt在這里的體現&#xff0c;但是&#xff0c;筆者認為之前的文章中&#xff0c;我只是機械的memcpy的Qt的…

Windows浮動ip怎么配置

Windows浮動IP怎么配置&#xff0c;達到IP漂移的效果&#xff0c;方法肯定是有的&#xff0c;這里我推薦一款好用的高可用Vip漂移軟件PanguVip&#xff0c;我們先看下最終達到的效果圖&#xff0c;如下所示PanguVip軟件免費下載百度網盤為您提供文件的網絡備份、同步和分享服務…

[langchain] Sync streaming vs Async Streaming

我不太清楚langchain中的sync stream 和 async steam有什么關系和區別sync stream from langchain.chat_models import init_chat_model from langchain_deepseek.chat_models import ChatDeepSeek import dotenv dotenv.load_dotenv()messages [ ("system", &quo…

nginx下lua的實現機制、Lua錯誤處理、面向對象

nginx下lua的實現機制 nginxlua概述 nginx&#xff1a;功能由模塊提供。 http模塊、events模塊&#xff0c;mail模塊。 處理http請求的時候&#xff0c;可以利用模塊做一些功能&#xff1a;eg&#xff1a;登錄校驗&#xff0c;js合并&#xff0c;數據庫訪問&#xff0c;鑒權。 …

Axure基于中繼器實現的組件庫(導航菜單、動態表格)

摘要 本文將為您詳細介紹基于 Axure 的中繼器組件庫中的 9 個獨特組件&#xff0c;這些組件不僅能夠極大地提升您的原型設計效率&#xff0c;還能為您的項目增添令人驚嘆的交互效果和視覺呈現。 引言 在當今快速發展的數字產品設計領域&#xff0c;原型設計工具的革新不斷推動著…