Vue2 與 Vue3 路由鉤子的區別及用法詳解

Vue2 與 Vue3 路由鉤子的區別及用法詳解

一、核心區別概覽

特性Vue2 (選項式API)Vue3 (組合式API)
定義方式組件選項形式在setup()中調用函數形式
鉤子名稱beforeRouteEnter/Update/LeaveonBeforeRouteUpdate/Leave
this訪問beforeRouteEnter不能訪問this無this概念,直接使用變量
異步處理next回調處理支持async/await
組合使用難以復用可輕松組合復用

二、Vue2 路由鉤子詳解

1. 三種組件內守衛

export default {// 1.進入路由前調用(不能訪問this)beforeRouteEnter(to, from, next) {next(vm => {// 通過vm訪問組件實例})},// 2.路由變化但組件復用時調用beforeRouteUpdate(to, from, next) {// 可以訪問thisif (to.params.id !== this.$route.params.id) {this.fetchData()}next()},// 3.離開路由前調用beforeRouteLeave(to, from, next) {if (this.unsavedChanges) {if (confirm('有未保存的更改!')) {next()} else {next(false)}} else {next()}}
}

2. 特點

  • beforeRouteEnter 是唯一不能訪問this的守衛
  • 必須調用next()來解析鉤子
  • 全局守衛(beforeEach等)仍可用

三、Vue3 路由鉤子詳解

1. 組合式API守衛

import { onBeforeRouteUpdate, onBeforeRouteLeave } from 'vue-router'export default {setup() {const unsavedChanges = ref(false)// 1.路由更新守衛onBeforeRouteUpdate(async (to, from) => {// 不需要next參數(除非需要重定向)if (to.params.id !== from.params.id) {await fetchData(to.params.id)}})// 2.路由離開守衛onBeforeRouteLeave((to, from) => {if (unsavedChanges.value) {return confirm('確定要離開嗎?')}})return { unsavedChanges }}
}

2. 重大變化

  1. 更簡單的API

    • 移除了next函數(除非需要重定向)
    • 返回false取消導航,返回trueundefined繼續導航
    • 可以返回路由路徑字符串或對象進行重定向
  2. 更好的TypeScript支持

  3. 組合復用示例

// 可復用的路由守衛邏輯
function useRouteLeaveGuard(unsavedChanges) {onBeforeRouteLeave(() => {if (unsavedChanges.value) {return confirm('確定離開?')}})
}// 組件中使用
setup() {const unsaved = ref(false)useRouteLeaveGuard(unsaved)// ...
}

四、遷移指南

從Vue2到Vue3的轉換示例

Vue2版本

beforeRouteLeave(to, from, next) {if (this.unsavedChanges) {next(confirm('離開嗎?'))} else {next()}
}

Vue3版本

setup() {const unsavedChanges = ref(false)onBeforeRouteLeave(() => {if (unsavedChanges.value) {return confirm('離開嗎?')}})
}

注意事項

  1. beforeRouteEnter在Vue3中沒有直接對應物,需要改用其他方式:

    // 替代方案:使用onMounted + 路由監聽
    setup() {const userData = ref(null)onMounted(async () => {userData.value = await fetchUser(route.params.id)})watch(() => route.params.id,async (newId) => {userData.value = await fetchUser(newId)})
    }
    
  2. 全局守衛(beforeEach等)在Vue3中用法保持不變

五、最佳實踐建議

  1. Vue3推薦模式

    • 優先使用組合式函數封裝可復用的路由邏輯
    • 利用async/await處理異步操作
    • 對于簡單邏輯,直接返回布爾值而非使用next
  2. 復雜場景處理

// 需要重定向的復雜場景
onBeforeRouteLeave((to, from) => {if (needRedirect) {return { path: '/login', query: { from: to.fullPath } }}if (unsavedChanges.value) {return confirm('確定離開?')}
})
  1. 組合多個守衛
setup() {// 可以注冊多個同類型守衛onBeforeRouteLeave(checkUnsavedChanges)onBeforeRouteLeave(logRouteChange)onBeforeRouteLeave(analyticsTracker)
}

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

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

相關文章

STM32的內存分配與堆棧

使用過cortex-M4內核單片機的朋友對下面這張圖一定不會感到陌生,它是ST原廠手冊里面的memory map,里面的信息量其實非常多,今天簡單說明一部分。我們在編寫stm32代碼的時候最長使用的地址有兩塊,第一塊是0x0000 0000~0x3FFF FFFF,…

OpenStack 03:創建實例

修改默認安全組 管理規則 添加規則 添加端口22規則 添加ping 規則 下載鏡像文件 Get images — Virtual Machine Image Guide documentation https://mirrors.tuna.tsinghua.edu.cn/fedora/releases/42/Cloud/x86_64/images/Fedora-Cloud-Base-Generic-42-1.1.x86_64.qcow2 …

企業級架構師綜合能力項目案例一(各種組件集群搭建+SpringBoot整合)

架構圖 用戶請求 → Nginx → Spring Cloud Gateway → 微服務集群↓MySQL集群主從復制(ShardingSphere) Redis集群主從復制(Sentinel)ES集群 MongoDB集群(分片)RocketMQ集群 Seata分布式事務搭建集群 Nginx集群和配置┌─────────…

學習stm32 窗口看門狗

窗口看門狗1.WWDG簡介窗口看門狗用于監測單片機程序運行時效是否精準,主要檢測軟件異常,一般用于需要精準檢測程序運行時間的場合。不僅防止程序 “卡死不喂狗”,還能避免程序 “異常早喂狗”(如死循環中誤執行喂狗指令&#xff0…

Selenium 等待機制:編寫穩定可靠的自動化腳本

一、為什么需要等待機制?網頁是動態加載的,元素出現的時間不確定。如果腳本在元素還沒加載完成時就嘗試操作它,就會拋出 NoSuchElementException 異常。三種等待方式:強制等待:time.sleep() - 簡單但低效隱式等待&…

蓓韻安禧活性葉酸獨立包裝防漏貼心設計

蓓韻安禧葉酸新升級 近期,蓓韻安禧在葉酸產品上進行了重要的優化升級。這次升級的核心在于產品形態和使用體驗的顯著提升,尤其體現在其包裝設計上。新版本采用了獨立密封的小包裝形式,每一份都精準包含每日所需的葉酸量。這種設計不僅有效避免…

8針腳的1.8寸IIC接口的TFT彩屏的八個引腳都需要使用嗎?

核心結論 不需要全部使用8個引腳。實際僅需連接 4根核心線(GND, VCC, SCL, SDA) 即可基本工作,其余引腳為功能增強或備用設計。具體需根據屏幕型號確認,但通用規則如下:8針腳功能分解引腳標號典型名稱是否必需作用不連…

刷題日記0831

今日計劃5道早上起來不困,吃好早飯開始困了,感覺刷不動題,就先做別的事,不困。現在別的事做好了,感覺能刷動題了。開始開始。7/5134. 加油站 中等超時了。看下題解。不是,怎么上數學了?假設從 x…

【2025.8.31】自學Java三個月,談談心路歷程順便給自己灌點雞湯

自學Java三個月,談談心得順便給自己灌點雞湯 6月1開始上班,到今天剛好三個月。從上班第一天決定開始自學java,到今天也是正好3個月整,想借這個機會簡單記錄一下學習java的契機和進度,α一些碎碎念。(括號恐…

linux內核trace_begin和trace_end使用分析

1,strace/ftrace的實現和使用 echo 1 > /sys/kernel/debug/tracing/tracing_on echo function > /sys/kernel/debug/tracing/current_tracer 2, 手動插入追蹤點 在內核代碼中,可以使用trace_printk函數手動插入追蹤點,標記代碼段的開始和結束: trace_printk(&…

Linux-驅動積累

Linux 設備驅動概述?Linux 設備驅動是內核與硬件交互的核心橋梁,負責屏蔽硬件細節、提供統一操作接口。其以內核模塊為主要存在形式,支持動態加載 / 卸載,核心功能涵蓋硬件初始化、中斷處理、電源管理及數據傳輸,是嵌入式 Linux …

軟考-系統架構設計師 決策支持系統(DSS)詳細講解

個人博客:blogs.wurp.top 一、DSS的核心概念與定位 1. 什么是DSS? DSS是一個交互式的、計算機化的系統,旨在幫助決策者利用數據和模型來解決半結構化(Semi-structured) 或非結構化(Non-structured&#…

《Python 實戰:構建一個可擴展的訂單管理系統,從基礎操作到架構思維》

《Python 實戰:構建一個可擴展的訂單管理系統,從基礎操作到架構思維》 一、引言:用代碼管理商業的脈搏 在數字化浪潮席卷各行各業的今天,訂單管理系統已成為電商、物流、零售等領域的核心支撐。它不僅承載著交易數據,更是企業運營效率的體現。而 Python,以其簡潔優雅的…

【計算機網絡】生產問題排查:如何使用Wireshark抓包/讀取抓包文件進行網絡分析

1 緣起 有一次,公司同事A讓同事B看一次請求日志, 同事B說先抓一次包看看請求是否進入服務器-某個服務, 我知道這個事情后,也“參觀”了抓包過程, 上面的事件只是一個小插曲,緊接著的第二件事才是寫本篇文章的真正動機: 同一天,同事C讓同事D配置個服務代理(某種上網方…

網格dp|

lc3665class Solution {public:int uniquePaths(vector<vector<int>>& grid) {const int MOD 1000000007;int m grid.size(), n grid[0].size();vector memo(m, vector(n, array<int, 2>{-1, -1})); // -1 表示沒有計算過auto dfs [&](this auto…

煩人的Nano 編輯器,如何退出呢?

對于不熟悉 nano 編輯器的人來說&#xff0c;它的退出方式確實有點反直覺。別擔心&#xff0c;這是幾乎所有新手都會遇到的困惑。 退出 Nano 編輯器的正確方法 記住這個黃金法則&#xff1a;ctrl鍵是你的朋友&#xff01; 1. 正常保存并退出&#xff08;最常用&#xff09; 按 …

IDM(Internet Download Managerv 6.38)破除解版下載!IDM 下載器永久免費版!提升下載速度達5倍!安裝及使用

軟件介紹 IDM&#xff08;Internet Download Manager&#xff09;是一款功能強大的 Windows 平臺專業下載加速工具&#xff0c;可加速下載速度、調度任務、續傳下載、管理文件。可使下載速度提升至普通瀏覽器的 5 倍以上&#xff0c;最高可加速 8 倍。IDM 支持 HTTP、FTP、HTTP…

學習Java29天(tcp多發多收)但是無解決客戶端啟動多個問題

180/189今天看了一些ip的東西WLAN的ip是路由器隨機分配的&#xff08;DHCP&#xff09;

Photoshop - Ps Camera Raw 濾鏡

使用Adobe Photoshop Camera Raw濾鏡對圖像進行快速和可逆的編輯。Camera Raw濾鏡將圖像拖入Photoshop工作區&#xff0c;或者點擊菜單欄-文件-打開來打開圖像。選中圖像的對應的圖層&#xff0c;點擊菜單欄-濾鏡-Camera Raw濾鏡&#xff0c;彈出Camera Raw濾鏡面板。使用Camer…

Node.js(4)—— http模塊基礎

下面我們來學nodejs中的http模塊。在此之前&#xff0c;你需要有一定的網絡知識儲備&#xff0c;能知道http&#xff0c;IP&#xff0c;端口是什么并且它們之間的關系。如果還不清楚或比較模糊&#xff0c;可以查看下面的文章&#xff1a; HTTP協議與IP 下面我們開始學習。 目…