Vue2和3的vue-router:生命周期、懶加載

Vue2 + vue-router

在 Vue 2 中使用 vue-router 可以方便地管理單頁面應用(SPA)中的路由。理解 vue-router 的生命周期和懶加載機制對于構建高效的 Vue 應用至關重要。以下是一些關鍵點和示例代碼來幫助你理解這些概念。

Vue Router 的生命周期
vue-router 提供了多個與路由相關的生命周期鉤子,這些鉤子可以在不同的時機被調用,以滿足需求。

全局守衛
1、beforeEach:路由變化之前調用。
2、beforeResolve:在 beforeEach 之后,在路由被確認之前調用。
3、afterEach:路由變化之后調用。

路由獨享守衛
1、beforeEnter:在路由配置中直接定義。

組件內的守衛
1、beforeRouteEnter:進入路由之前調用,不能訪問 this。
2、beforeRouteUpdate:路由參數變化時調用。
3、beforeRouteLeave:離開當前路由時調用。

示例代碼
以下是一個簡單的示例,展示了如何在 Vue 2 項目中使用 vue-router 的生命周期鉤子

// router/index.js
import Vue from 'vue';
import Router from 'vue-router';
import Home from '@/components/Home.vue';
import About from '@/components/About.vue';Vue.use(Router);const router = new Router({routes: [{path: '/',name: 'Home',component: Home,beforeEnter: (to, from, next) => {console.log('Entering Home route');next();}},{path: '/about',name: 'About',component: About,beforeEnter: (to, from, next) => {console.log('Entering About route');next();}}]
});// 全局守衛
router.beforeEach((to, from, next) => {console.log('Global beforeEach guard');next();
});router.afterEach((to, from) => {console.log('Global afterEach hook');
});export default router;

組件內的守衛:

<template><div><h1>Home Page</h1><!-- 其他模板內容 --></div>
</template><script>
export default {name: 'Home',// 組件內的守衛 - 進入路由之前調用beforeRouteEnter(to, from, next) {console.log('Entering Home route...');// 注意:在這里你不能訪問組件實例(this)next(vm => {// 當導航被確認時,并且組件實例被創建后,// 你可以通過 `vm` 訪問組件實例console.log('Access to component instance via `vm`:', vm);});},// 組件內的守衛 - 路由參數變化時調用beforeRouteUpdate(to, from, next) {console.log('Route to Home updated...');// 在這里你可以訪問組件實例(this)next();},// 組件內的守衛 - 離開當前路由時調用beforeRouteLeave(to, from, next) {console.log('Leaving Home route...');// 你可以在這里提示用戶保存更改,或者執行其他邏輯const answer = window.confirm('Do you really want to leave? You have unsaved changes!');if (answer) {next();} else {next(false); // 阻止導航}},// 其他組件選項...
};
</script><style scoped>
/* 樣式內容 */
</style>

在上面的示例中,beforeRouteEnter 守衛在路由進入組件之前被調用。由于此時組件實例尚未被創建,因此你不能訪問 this。但是,next 函數可以接收一個回調函數,該回調函數將在組件實例被創建后被調用,并且可以通過該回調函數的參數訪問組件實例。

beforeRouteUpdate 守衛在路由參數變化時被調用,此時組件實例已經存在,因此你可以訪問 this。

beforeRouteLeave 守衛在離開當前路由時被調用,你可以在這里提示用戶保存更改,或者執行其他邏輯。如果調用 next(false),則可以阻止導航。

請注意,在 beforeRouteEnter 和 beforeRouteUpdate 守衛中,next 函數必須被調用,否則導航將被掛起。而在 beforeRouteLeave 守衛中,如果不調用 next,則導航也會被掛起,但通常你會根據用戶的操作來調用 next(true) 或 next(false)。

懶加載實現

// router/index.js
import Vue from 'vue';
import Router from 'vue-router';Vue.use(Router);const router = new Router({routes: [{path: '/',name: 'Home',// 使用動態 import() 實現懶加載component: () => import(/* webpackChunkName: "home" */ '@/components/Home.vue'),beforeEnter: (to, from, next) => {console.log('Entering Home route');next();}},{path: '/about',name: 'About',component: () => import(/* webpackChunkName: "about" */ '@/components/About.vue'),beforeEnter: (to, from, next) => {console.log('Entering About route');next();}}]
});// 全局守衛
router.beforeEach((to, from, next) => {console.log('Global beforeEach guard');next();
});router.afterEach((to, from) => {console.log('Global afterEach hook');
});export default router;

在上述代碼中,component 屬性被替換為返回一個 Promise 的函數,該 Promise 解析為組件。webpackChunkName 是一個特殊的注釋,用于在 Webpack 中為這些動態加載的模塊命名,從而生成更具可讀性的文件名。

Vue3 + vue-router

在 Vue 3 中,vue-router 的生命周期與 Vue 2 類似,但有一些細微的差別和新增的功能。同時,懶加載(也稱為代碼拆分)是優化 Vue 應用性能的一種重要手段,特別是在處理大型單頁應用(SPA)時。

Vue Router 的生命周期
在 Vue Router 中,有幾個關鍵的生命周期鉤子(也稱為導航守衛),它們允許你在路由變化的不同階段執行代碼。這些鉤子包括:

全局守衛:
1、beforeEach:在每次路由改變之前調用。
2、beforeResolve:在路由解析之前調用,但在全局組件守衛和異步組件被解析之后。
3、afterEach:在每次路由改變之后調用(不接收 next 函數)。

全局守衛在整個應用中只定義一次,通常用于權限驗證、日志記錄等。

// router/index.js
import { createRouter, createWebHistory } from 'vue-router';
import Home from '../views/Home.vue';
import About from '../views/About.vue';const routes = [{path: '/',name: 'Home',component: Home},{path: '/about',name: 'About',component: About}
];const router = createRouter({history: createWebHistory(process.env.BASE_URL),routes
});// 全局前置守衛
router.beforeEach((to, from, next) => {console.log('Global beforeEach guard');// 在這里可以添加權限驗證等邏輯next();
});// 全局解析守衛
router.beforeResolve((to, from, next) => {console.log('Global beforeResolve guard');next();
});// 全局后置鉤子
router.afterEach((to, from) => {console.log('Global afterEach hook');// 在這里可以添加日志記錄等邏輯
});export default router;

路由獨享守衛:
1、beforeEnter:在路由配置中直接定義,只在進入該路由時調用。

路由守衛是定義在單個路由對象上的鉤子,可以用于該路由的特定邏輯。

// router/index.js
import { createRouter, createWebHistory } from 'vue-router';
import Home from '../views/Home.vue';
import About from '../views/About.vue';const routes = [{path: '/',name: 'Home',component: Home,beforeEnter: (to, from, next) => {console.log('Before enter Home');next();}},{path: '/about',name: 'About',component: About,beforeEnter: (to, from, next) => {console.log('Before enter About');// 可以添加邏輯,比如檢查用戶是否登錄next();}}
];const router = createRouter({history: createWebHistory(process.env.BASE_URL),routes
});export default router;

組件內守衛:
1、beforeRouteEnter:在進入路由組件之前調用(無法訪問組件實例 this)。
2、beforeRouteUpdate:在路由參數變化時調用(可以訪問組件實例 this)。
3、beforeRouteLeave:在離開路由組件之前調用(可以訪問組件實例 this)。

組件內的守衛是定義在 Vue 組件內部的鉤子,用于處理該組件的路由變化。

<!-- Home.vue -->
<template><div>Home Page</div>
</template><script>
export default {name: 'Home',beforeRouteEnter(to, from, next) {console.log('Home beforeRouteEnter');next();},beforeRouteUpdate(to, from, next) {console.log('Home beforeRouteUpdate');// 僅在路由參數變化時觸發next();},beforeRouteLeave(to, from, next) {console.log('Home beforeRouteLeave');// 可以添加確認離開的邏輯next();}
};
</script>

在 Vue 3 的 script setup 語法糖中
import { onBeforeRouteLeave, onBeforeRouteUpdate } from ‘vue-router’;
可以直接引用,也可以通過Vue Router 提供的 useRoute 和 useRouter 的組合式 API 和 onMounted、onBeforeUnmount 等 Vue 的生命周期鉤子來實現類似的功能。

懶加載實現

// router/index.js
import { createRouter, createWebHistory } from 'vue-router';const routes = [{path: '/',name: 'Home',// 使用動態導入語法懶加載 Home 組件component: () => import('../views/Home.vue'),},{path: '/about',name: 'About',// 使用動態導入語法懶加載 About 組件component: () => import('../views/About.vue'),},// 其他路由配置...
];const router = createRouter({history: createWebHistory(process.env.BASE_URL),routes,
});export default router;

Vue3 和 新的 router 版本新加了

1、 滾動行為管理:
你可以通過scrollBehavior配置選項來自定義滾動行為。例如,你可以保持之前的滾動位置,或者在路由跳轉時滾動到頁面頂部。
scrollBehavior方法接收一個到目標路由和當前路由的對象參數,并返回一個包含滾動位置信息的對象。
例如:

const router = createRouter({history: createWebHistory(),routes,scrollBehavior(to, from, savedPosition) {if (savedPosition) {return savedPosition} else {return { x: 0, y: 0 } // 滾動到頁面頂部}}
})

2、組合式API的集成:
Vue 3引入了組合式API,這允許你以更靈活和可復用的方式組織組件邏輯。vue-router 4也相應地提供了與組合式API集成的功能。
你可以使用useRoute鉤子來訪問當前路由的狀態(如當前路由的路徑、參數、查詢等),以及使用useRouter鉤子來訪問路由實例(如進行編程式導航)。
例如:

import { useRoute, useRouter } from 'vue-router'export default {setup() {const route = useRoute()const router = useRouter()// 訪問當前路由的路徑const currentPath = route.path// 進行編程式導航const navigateTo = (path) => {router.push(path)}return {currentPath,navigateTo}}
}

3、路由懶加載:
雖然懶加載在 Vue 2 中就已經存在,但 Vue 3 和 vue-router 4 提供了更簡潔和易用的語法來實現路由懶加載。你可以使用動態導入(import())語法來按需加載路由組件。

**Vue2和3 不同點
在Vue 2中,通常使用new VueRouter()來創建路由實例。
在Vue 3中,你需要使用createRouter函數來創建路由實例,并傳入一個包含history和routes配置對象的參數。例如:

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

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

相關文章

【408--考研復習筆記】計算機網絡----知識點速覽

目錄 一、計算機網絡體系結構 1.計算機網絡的定義與功能&#xff1a; 2.網絡體系結構相關概念&#xff1a; 3.OSI 七層模型與 TCP/IP 模型&#xff1a; 4.通信方式與交換技術&#xff1a; 電路交換 報文交換 分組交換 5.端到端通信和點到點通信&#xff1a; 6.計算機…

MySQL-- 多表查詢的分類,SQL92與SQL99,7種JOIN的實現,SQL99語法的新特性

目錄 一&#xff0c;多表查詢的分類 角度1&#xff1a;等值連接 vs 非等值連接 角度2&#xff1a;自連接 vs 非自連接 角度3&#xff1a;內連接 vs 外連接 二&#xff0c;SQL92語法實現內連接&#xff1a;見上&#xff0c;略SQL92語法實現外連接&#xff1a;使用 -…

時間輪算法:原理、演進與應用實踐指南

目錄 1. 時間輪算法基礎 1.1 什么是時間輪算法&#xff1f; 1.2 核心組成部分 2. 基本時間輪的實現機制 2.1 時間輪的構成要素 2.2 工作原理詳解 3. 基本時間輪的局限性 3.1 時間范圍限制問題 3.2 簡單解決方案及其缺陷 4. 時間輪算法的演進 4.1 Round機制&#xff…

Unity 常見報錯 定位和查找方法

1.控制臺 直接看報錯信息 2.打log 例子&#xff1a; for(int i 0;i < 8;i) {Debug.Log(i);//這是打的log,看看到底i是幾的時候出問題gameObject.name strs[i];} 3.斷點調試 &#xff08;1&#xff09;在你想打斷點的行&#xff0c;左邊空白處點擊可以打斷點&#xff…

第十八章:Python實戰專題:北京市水資源數據可視化與圖書館書籍管理應用開發

今天我要和大家分享兩個非常有趣的Python實戰項目&#xff1a;一個是北京市2001-2017年水資源數據的可視化分析&#xff0c;另一個是圖書館書籍管理應用程序的開發。這兩個項目都使用了Python的主流庫&#xff0c;比如Pandas、Matplotlib和Tkinter&#xff0c;非常適合初學者學…

音視頻基礎(音視頻的錄制和播放原理)

文章目錄 一、錄制原理**1. 音視頻數據解析****2. 音頻處理流程****3. 視頻處理流程****4. 同步控制****5. 關鍵技術點****總結** 二、播放原理**1. 音視頻數據解析****2. 音頻處理流程****3. 視頻處理流程****4. 同步控制****5. 關鍵技術點****總結** 一、錄制原理 這張圖展示…

Nginx多域名HTTPS配置全攻略:從證書生成到客戶端安裝

一、業務背景 在現代Web開發中&#xff0c;HTTPS已成為保障數據傳輸安全的標準協議。特別是對于地圖類API服務&#xff08;如高德地圖&#xff09;&#xff0c;往往需要同時支持多個子域名&#xff08;如webapi.amap.com、restapi.amap.com等&#xff09;的HTTPS訪問。傳統方式…

Redis原理:rename命令

RENAME key newkey 將一個key重命名為新key&#xff0c;如果key不存在&#xff0c;則會返回異常。如果newKey已經存在&#xff0c;則會被覆蓋&#xff0c;其實newKey會被顯示的刪除&#xff0c;所以如果newKey是一個大key&#xff0c;則會引起延遲。 源碼 void renameCommand…

k8s污點與容忍

k8s污點與容忍 k8s污點管理常用命令effect標記值查看污點添加污點刪除污點 node污點與容忍污點容忍yaml示例容忍放大基于污點的驅逐驅逐時排除指定服務 設置master調度設置master盡量不調度允許master節點調度pod恢復Master Only狀態將node標記為不可調度狀態(節點警戒)設置nod…

(BFS)題解:P9425 [藍橋杯 2023 國 B] AB 路線

題解&#xff1a;P9425 [藍橋杯 2023 國 B] AB 路線 題目傳送門 P9425 [藍橋杯 2023 國 B] AB 路線 一、題目描述 給定一個NM的迷宮&#xff0c;每個格子標記為A或B。從左上角(1,1)出發&#xff0c;需要移動到右下角(N,M)。移動規則是&#xff1a;必須交替走K個A格子和K個B…

python-leetcode 62.搜索插入位置

題目&#xff1a; 給定一個排序數組和一個目標值&#xff0c;在數組中找到目標值&#xff0c;并返回其索引。如果目標值不存在于數組中&#xff0c;返回它將會被按順序插入的位置 方法一&#xff1a;二分查找 假設題意是在排序數組中尋找是否存在一個目標值&#xff0c;則可以…

【計網速通】計算機網絡核心知識點和高頻考點——數據鏈路層(一)

數據鏈路層核心知識點&#xff08;一&#xff09; 一、數據鏈路層概述 1.1 基本概念 數據鏈路層位于OSI模型的第二層&#xff0c;介于物理層和網絡層之間&#xff0c;主要負責在相鄰節點之間傳輸和識別數據幀。 1.2 主要功能 幀同步&#xff1a;識別幀的開始和結束差錯控制…

模型部署與調用

目錄 部署 ollama下載 模型版本選擇 ?編輯 對照表 控制臺執行 調用 部署 大模型部署我使用的是Ollama&#xff0c;點擊跳轉 接下來我將在本地使用ollama就行模型部署的演示 ollama下載 模型版本選擇 對照表 大家可以根據自己的顯卡配置選擇對應的模型版本 控制臺執…

Rstudio如何使用Conda環境配置的R

前言 Rstudio作為一款流行的R語言集成開發環境&#xff08;IDE&#xff09;&#xff0c;為用戶提供了便捷的編程體驗。然而&#xff0c;不同項目可能需要不同版本的R&#xff0c;這就需要我們靈活切換R版本。除了在之前文章中提到的使用 Docker 部署不同版本的 R 的方法之外&am…

C++---RAII模式

一、RAII模式概述 1. 定義 RAII&#xff08;Resource Acquisition Is Initialization&#xff09;即資源獲取即初始化&#xff0c;是C中用于管理資源生命周期的一種重要編程模式。其核心在于將資源的獲取和釋放操作與對象的生命周期緊密綁定。當對象被創建時&#xff0c;資源…

【功能開發】DSP F2837x 檢測中斷所有函數運行一次的時間

要查看 DSP F28377 的 CPU 在 50 微秒一次的中斷內所有程序運行完總共占用了中斷多長時間&#xff0c;可以采用硬件定時器測量和軟件計時兩種常見方法。 方法一&#xff1a;使用硬件定時器測量 原理 利用 DSP 內部的高精度硬件定時器&#xff0c;在中斷開始時記錄定時器的值…

MAC環境給docker換源

2025-03-28 MAC環境給docker換源 在官網下載docker ,dmg 文件 參考&#xff1a; https://blog.csdn.net/qq_73162098/article/details/145014490 {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},&q…

Vulnhub-zico2靶機打靶記錄

本篇文章旨在為網絡安全滲透測試靶機教學。通過閱讀本文&#xff0c;讀者將能夠對滲透Vulnhub系列zico2靶機有一定的了解 一、信息收集階段 靶機下載地址&#xff1a;https://download.vulnhub.com/zico/zico2.ova 因為靶機為本地部署虛擬機網段&#xff0c;查看dhcp地址池設…

【LeetCode 熱題100】347:前 K 個高頻元素(詳細解析)(Go語言版)

&#x1f680; 力扣熱題 347&#xff1a;前 K 個高頻元素&#xff08;詳細解析&#xff09; &#x1f4cc; 題目描述 力扣 347. 前 K 個高頻元素 給你一個整數數組 nums 和一個整數 k&#xff0c;請你返回其中出現頻率 前 k 高的元素。你可以按 任意順序 返回答案。 &#x1f…

Java 大視界 -- Java 大數據機器學習模型在金融衍生品定價中的創新方法與實踐(166)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…