Vue 3 30天精進之旅:Day 13 - 路由守衛

在構建單頁面應用時,路由守衛是一個非常重要的概念。它允許我們在路由進入或離開時執行一些操作,比如驗證用戶權限、處理數據加載、執行導航確認等。Vue Router提供了多種類型的路由守衛,使我們能夠靈活地控制路由的行為。在今天的學習中,我們將重點探討以下內容:

  1. 路由守衛概述
  2. 全局守衛
  3. 路由獨享守衛
  4. 組件內守衛
  5. 動態路由守衛
  6. 使用實際示例理解路由守衛
  7. 總結與實踐

1. 路由守衛概述

路由守衛是指在路由確認的過程中執行的一些鉤子函數,用于控制路由的訪問及處理。在Vue Router中,主要有以下幾種路由守衛:

  • 全局守衛:在所有路由變化前后生效。
  • 路由獨享守衛:只在特定路由的變化時生效。
  • 組件內守衛:在組件的生命周期中執行的守衛。

通過這些守衛,你可以放心地控制用戶訪問權限、加載數據、顯示loading等狀態。

2. 全局守衛

全局守衛是在創建路由實例時通過?router.beforeEach?和?router.afterEach?方法定義的。beforeEach?會在每次路由切換前執行,而?afterEach?則在路由切換后執行。

示例

javascript

// main.js
import { createRouter, createWebHistory } from 'vue-router';
import store from './store'; // 引入Vuex Storeconst routes = [/* 定義路由 */
];const router = createRouter({history: createWebHistory(),routes,
});// 全局前置守衛
router.beforeEach((to, from, next) => {const isAuthenticated = store.state.user.isAuthenticated; // 從Vuex中檢驗用戶認證狀態if (to.meta.requiresAuth && !isAuthenticated) {next({ name: 'login' }); // 未登錄,重定向到登錄頁} else {next(); // 繼續路由}
});// 全局后置守衛
router.afterEach((to, from) => {console.log('Navigated to:', to.name);
});export default router;

在這個示例中,beforeEach?用于檢查用戶是否已認證,如果目標路由需要認證但用戶未登錄,則重定向到登錄頁面。

3. 路由獨享守衛

路由獨享守衛是在特定路由配置中的?beforeEnter?函數。它僅在該路由被訪問時執行。

示例

javascript

const routes = [{path: '/protected',component: ProtectedView,beforeEnter: (to, from, next) => {const isAuthenticated = store.state.user.isAuthenticated;if (isAuthenticated) {next(); // 繼續訪問} else {next({ name: 'login' }); // 重定向到登錄}},},
];

在這個示例中,beforeEnter?檢查用戶是否認證,只有認證用戶才可以訪問?/protected?頁面。

4. 組件內守衛

組件內守衛是指在某個組件的主入口中定義的守衛,有三個主要鉤子函數:beforeRouteEnterbeforeRouteUpdate?和?beforeRouteLeave

示例

javascript

export default {name: 'SomeComponent',beforeRouteEnter(to, from, next) {// 在路由進入前執行console.log('Entering SomeComponent');next();},beforeRouteUpdate(to, from, next) {// 在路由更新時執行console.log('Updating SomeComponent');next();},beforeRouteLeave(to, from, next) {// 在路由離開前執行const answer = window.confirm('Are you sure you want to leave this page?');if (answer) {next();} else {next(false); // 取消導航}},
};

在這個示例中,beforeRouteLeave?可以處理用戶在頁面離開之前的確認提示。

5. 動態路由守衛

動態路由守衛是在創建路由時定義的,用于在特定條件下運行的守衛。例如,根據用戶的角色權限決定用戶能訪問哪些路由。

示例

javascript

const routes = [{path: '/admin',component: AdminView,meta: { requiresAuth: true, roles: ['admin'] },beforeEnter: (to, from, next) => {const userRole = store.state.user.role;if (to.meta.roles.includes(userRole)) {next();} else {next({ name: 'forbidden' });}},},
];

這里通過?meta?和路由守衛來驗證用戶角色,只有具有?admin?角色的用戶能夠訪問該路由。

6. 使用實際示例理解路由守衛

下面是一個簡單的應用示例,它集成了全局守衛、路由獨享守衛和組件內守衛:

組件示例

vue

<template><div><h1>Welcome to My App</h1><router-link to="/protected">Go to Protected Page</router-link><router-link to="/admin">Go to Admin Page</router-link></div>
</template><script>
export default {name: 'Home',
};
</script>

路由配置示例

javascript

const routes = [{ path: '/', component: Home },{ path: '/protected', component: ProtectedView, meta: { requiresAuth: true } },{ path: '/admin', component: AdminView, meta: { requiresAuth: true, roles: ['admin'] } },{ path: '/login', component: Login },{ path: '/forbidden', component: Forbidden },
];const router = createRouter({history: createWebHistory(),routes,
});// 全局守衛
router.beforeEach((to, from, next) => {const isAuthenticated = store.state.user.isAuthenticated;if (to.meta.requiresAuth && !isAuthenticated) {next({ name: 'login' });} else {next();}
});

在這個例子中,用戶在未認證的情況下嘗試訪問受保護的頁面時,將被重定向到登錄頁面。

7. 總結與實踐

今天我們探討了路由守衛的相關知識,了解了全局守衛、路由獨享守衛和組件內守衛的具體用法。路由守衛的使用使得我們能夠在路由切換時執行自定義邏輯,從而實現更加復雜的訪問控制和數據處理邏輯。

練習

  1. 在你的項目中實現一個需要登錄才能訪問的受保護頁面,并使用路由守衛來控制訪問。
  2. 創建一個擁有角色權限的管理系統,使用動態路由守衛控制不同角色用戶的訪問權限。
  3. 嘗試在組件內守衛中添加確認離開的邏輯,防止用戶在未保存的情況下離開頁面。

通過完成這些練習,你將對路由守衛的使用有更深入的理解。在接下來的學習中,我們將探索?Vue 的動畫?相關內容,敬請期待!

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

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

相關文章

【TypeScript】基礎:數據類型

文章目錄 TypeScript一、簡介二、類型聲明三、數據類型anyunknownnervervoidobjecttupleenumType一些特殊情況 TypeScript 是JavaScript的超集&#xff0c;代碼量比JavaScript復雜、繁多&#xff1b;但是結構更清晰 一、簡介 為什么需要TypeScript&#xff1f; JavaScript的…

C++模板編程——可變參函數模板

目錄 1. 可變參函數模板基本介紹 2. 參數包展開——通過遞歸函數 3. 參數包展開——通過編譯期間if語句(constexpr if) 4. 重載 5. 后記 進來看的小伙伴們應該對C中的模板有了一定了解&#xff0c;下面給大家介紹一下可變參函數模板。過于基礎的概念將不仔細介紹。 1. 可變…

ChatGPT-4o和ChatGPT-4o mini的差異點

在人工智能領域&#xff0c;OpenAI再次引領創新潮流&#xff0c;近日正式發布了其最新模型——ChatGPT-4o及其經濟實惠的小型版本ChatGPT-4o Mini。這兩款模型雖同屬于ChatGPT系列&#xff0c;但在性能、應用場景及成本上展現出顯著的差異。本文將通過圖文并茂的方式&#xff0…

三數之和(15)

15. 三數之和 - 力扣&#xff08;LeetCode&#xff09; 可以一起總結的題目&#xff1a;三角形的最大周長&#xff08;976&#xff09;-CSDN博客 解法&#xff1a; class Solution { public:vector<vector<int>> threeSum(vector<int>& nums) {vector…

2025最新源支付V7全套開源版+Mac云端+五合一云端

2025最新源支付V7全套開源版Mac云端五合一云端 官方1999元&#xff0c; 最新非網上那種功能不全帶BUG開源版&#xff0c;可以自己增加授權或二開 擁有卓越的性能和豐富的功能。它采用全新輕量化的界面UI&#xff0c;讓您能更方便快捷地解決知識付費和運營贊助的難題 它基于…

9 點結構模塊(point.rs)

一、point.rs源碼 use super::UnknownUnit; use crate::approxeq::ApproxEq; use crate::approxord::{max, min}; use crate::length::Length; use crate::num::*; use crate::scale::Scale; use crate::size::{Size2D, Size3D}; use crate::vector::{vec2, vec3, Vector2D, V…

數據分析系列--[12] RapidMiner辨別分析(含數據集)

一、數據準備 二、導入數據 三、數據預處理 四、建模辨別分析 五、導入測試集進行辨別分析 一、數據準備 點擊下載數據集 二、導入數據 三、數據預處理 四、建模辨別分析 五、導入測試集進行辨別分析 Ending, congratulations, youre done.

Day33【AI思考】-函數求導過程 的優質工具和網站

文章目錄 **函數求導過程** 的優質工具和網站**一、動態圖形工具**1. **Desmos&#xff08;網頁端&#xff09;**2. **GeoGebra&#xff08;全平臺&#xff09;** **二、分步推導工具**3. **Wolfram Alpha&#xff08;網頁/App&#xff09;**4. **Symbolab&#xff08;網頁/App…

個人筆記(很沒營養,純備忘錄)

1.輸入電阻和輸出電阻指在一個可劃分為3部分的電路中&#xff0c;中間部分電路相當于前面電路的負載有輸入端電阻&#xff0c;稱輸入電阻&#xff0c;相對于后面部分等效為電源有輸出端內阻&#xff0c;稱輸出電阻 理所當然的希望輸出電阻對負載影響小&#xff0c;輸入電阻能完…

當卷積神經網絡遇上AI編譯器:TVM自動調優深度解析

從銅線到指令&#xff1a;硬件如何"消化"卷積 在深度學習的世界里&#xff0c;卷積層就像人體中的毛細血管——數量龐大且至關重要。但鮮有人知&#xff0c;一個簡單的3x3卷積在CPU上的執行路徑&#xff0c;堪比北京地鐵線路圖般復雜。 卷積的數學本質 對于輸入張…

51單片機 02 獨立按鍵

一、獨立按鍵控制LED亮滅 輕觸按鍵&#xff1a;相當于是一種電子開關&#xff0c;按下時開關接通&#xff0c;松開時開關斷開&#xff0c;實現原理是通過輕觸按鍵內部的金屬彈片受力彈動來實現接通和斷開。 #include <STC89C5xRC.H> void main() { // P20xFE;while(1){…

系統URL整合系列視頻二(界面原型)

視頻 系統URL整合系列視頻二&#xff08;界面原型&#xff09; 視頻介紹 &#xff08;全國&#xff09;大型分布式系統Web資源URL整合需求界面原型講解。當今社會各行各業對軟件系統的web資源訪問權限控制越來越嚴格&#xff0c;控制粒度也越來越細。安全級別提高的同時也增加…

vscode命令面板輸入 CMake:build不執行提示輸入

CMake&#xff1a;build或rebuild不編譯了&#xff0c;彈出:> [Add a new preset] , 提示輸入發現settings.jsons設置有問題 { "workbench.colorTheme": "Default Light", "cmake.pinnedCommands": [ "workbench.action.tasks.configu…

wax到底是什么意思

在很久很久以前&#xff0c;人類還沒有誕生文字之前&#xff0c;人類就產生了語言&#xff1b;在誕生文字之前&#xff0c;人類就已經使用了語言很久很久。 沒有文字之前&#xff0c;人們的語言其實是相對比較簡單的&#xff0c;因為人類的生產和生活水平非常低下&#xff0c;…

SSRF 漏洞利用 Redis 實戰全解析:原理、攻擊與防范

目錄 前言 SSRF 漏洞深度剖析 Redis&#xff1a;強大的內存數據庫 Redis 產生漏洞的原因 SSRF 漏洞利用 Redis 實戰步驟 準備環境 下載安裝 Redis 配置漏洞環境 啟動 Redis 攻擊機遠程連接 Redis 利用 Redis 寫 Webshell 防范措施 前言 在網絡安全領域&#xff0…

【周易哲學】生辰八字入門講解(八)

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一個正在變禿、變強的文藝傾年。 &#x1f514;本文講解【周易哲學】生辰八字入門講解&#xff0c;期待與你一同探索、學習、進步&#xff0c;一起卷起來叭&#xff01; 目錄 一、六親女命六親星六親宮位相互關系 男命六親星…

CAN總線數據采集與分析

CAN總線數據采集與分析 目錄 CAN總線數據采集與分析1. 引言2. 數據采集2.1 數據采集簡介2.2 數據采集實現3. 數據分析3.1 數據分析簡介3.2 數據分析實現4. 數據可視化4.1 數據可視化簡介4.2 數據可視化實現5. 案例說明5.1 案例1:數據采集實現5.2 案例2:數據分析實現5.3 案例3…

【c++】類與對象詳解

目錄 面向過程思想和面向對象思想類的定義引入類的關鍵字類定義的兩種方式類的訪問限定符類的作用域類大小的計算封裝 this指針類的6個默認成員函數構造函數初步理解構造函數深入理解構造函數初始化列表單參數構造函數引發的隱式類型轉換 析構函數拷貝構造函數賦值運算符重載運…

大模型訓練(5):Zero Redundancy Optimizer(ZeRO零冗余優化器)

0 英文縮寫 Large Language Model&#xff08;LLM&#xff09;大型語言模型Data Parallelism&#xff08;DP&#xff09;數據并行Distributed Data Parallelism&#xff08;DDP&#xff09;分布式數據并行Zero Redundancy Optimizer&#xff08;ZeRO&#xff09;零冗余優化器 …

陸游的《詩人苦學說》:從藻繪到“功夫在詩外”(中英雙語)mastery lies beyond poetry

陸游的《詩人苦學說》&#xff1a;從藻繪到“功夫在詩外” 今天看萬維鋼的《萬萬沒想到》一書&#xff0c;看到陸游的功夫在詩外的句子&#xff0c;特意去查找這首詩的原文。故而有此文。 我國學人還往往過分強調“功夫在詩外”這句陸游的名言&#xff0c;認為提升綜合素質是一…