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.mzph.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;也…