vue-router 完整的导航流程解析

1、导航被触发

2、在失活的组件里调用 beforeRouteLeave 守卫

组件内守卫beforeRouteLeave:在离开该组件之前,会先调用它(用于在离开组件前保存或清理一些状态)

import { onBeforeRouteLeave } from 'vue-router'onBeforeRouteLeave((to, from, next) => {console.log('to=', to)console.log('from=', from)* 如果需要,你可以基于条件阻止导航if (/* some condition */) {next(false) // 取消导航} else {next() // 允许导航}* 默认情况下,调用 next() 允许导航继续next(false)})

3、调用全局的 beforeEach 守卫

全局的前置守卫beforeEach:它会在路由改变之前被调用,用于执行一些全局的权限检查、重定向等逻辑

4、在重用的组件里调用 beforeRouteUpdate 守卫(2.2+)

组件内守卫beforeRouteUpdate:当路由改变,但是该组件被复用时(例如,只是路由参数改变)

                            这个守卫,允许,你在组件复用时执行一些逻辑,比如更新DOM。
const userId = ref(null)const route = useRoute()setup() {onBeforeRouteUpdate((to, from, next) => {* 根据新的路由参数,来更新组件的数据userId.value = to.params.id // 假设,路由参数中有一个idnext()})// 初始化userId(可选,取决于你的具体需求)if (route.params.id) {userId.value = route.params.id}}

5、在路由配置里调用 beforeEnter

6、解析异步路由组件

7、在被激活的组件里调用 beforeRouteEnter

在进入目标路由的组件之前,会调用 beforeRouteEnter 守卫,

注意:

因为,这个守卫,在导航被确认之前调用,所以,此时的组件实例,还没有被创建,因此,你不能直接访问组件实例,但是,你可以通过 next 回调来访问组件实例。

setup() {const someData = ref(null)注意:'onBeforeRouteEnter' 不能在 'setup' 中直接使用,因此,我们需要将它作为一个单独的函数,定义在组件外部const beforeRouteEnterGuard = (to, from, next) => {* 这里没有组件实例,因为,组件还没有被创建,但是,你可以访问路由参数和查询console.log('在组件被创建之前,即将进入路由', to.path)* 可以在这里执行一些异步操作,比如:从服务器获取数据next(vm => {*通过 `vm` 访问组件实例})}* 在组件外部,定义 'onBeforeRouteEnter' 守卫onBeforeRouteEnter(beforeRouteEnterGuard)onMounted(() => {  console.log('组件已挂载')})
}

8、调用全局的 beforeResolve 守卫(2.5+)

它在,所有组件内守卫异步路由组件被解析之后,但在DOM更新之前被调用(此时,DOM未更新,所以不能直接操作DOM),

意味着,在 beforeResolve 守卫中,可以进行那些依赖于异步解析的数据的操作,

	import { createRouter, createWebHistory } from 'vue-router'const routes = [  {path: '/async',name: 'Async',component: () => import('./views/AsyncComponent.vue')}// ...]const router = createRouter({history: createWebHistory(),routes,})* 使用 beforeResolve 守卫router.beforeResolve(async (to, from, next) => {* 假设,我们需要根据路由的某些参数,来加载一些数据if (to.path === '/async') {try {* 异步获取一些数据const data = await fetchSomeData(to.query.id) * 假设,fetchSomeData是一个返回Promise的函数* 你可以将数据存储在:Vuex、localStorage、sessionStorageconsole.log('Loaded data for route=', data)* 确保导航继续next()} catch (error) {* 如果加载数据失败,可以重定向到错误页面,或执行其他逻辑console.error('Failed to load data:', error)next(false) // 中断导航// 或者你可以重定向到另一个路由// next('/error-page')}} else {* 对于其他路由,直接继续next()}})

9、导航被确认

此时,路由已经确定,并准备进行导航

10、调用全局的 afterEach 钩子

无论导航是否成功,都会调用 afterEach 钩子,

这个守卫不接受 next 函数,因为,它发生在所有导航守卫之后,此时路由跳转已经完成,

主要用于进行一些不需要等待导航完成的操作,如分析、记录等。

afterEach是全局后置守卫,它在路由跳转完成后被调用

import { createRouter, createWebHistory } from 'vue-router'const routes = [// 定义你的路由...]const router = createRouter({history: createWebHistory(),routes,})// 使用 afterEach 守卫router.afterEach((to, from) => {* 这里的逻辑,会在每次路由跳转完成后执行* 例如,我们可以记录一些导航信息console.log('Navigation Completed:', to.path)* 发送统计信息到服务器sendAjax({ fromPath: from.path, toPath: to.path })* 清除页面级别的临时数据// clearPageLevelData()* 其他需要在路由跳转后执行的操作....})

11、触发 DOM 更新

Vue 开始更新 DOM 以反映新的路由

12、调用 beforeRouteEnter 守卫中传给 next 的回调函数,创建好的组件实例会作为回调函数的参数传入

如果,在 beforeRouteEnter 守卫中传递了一个回调函数给 next,

那么,在这个阶段会调用这个回调函数,

此时,组件实例已经被创建,并会作为回调函数的参数传入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/13648.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

键盘盲打是练出来的

键盘盲打是练出来的,那该如何练习呢?很简单,看着屏幕提示跟着练。屏幕上哪里有提示呢?请看我的截屏: 截屏下方有8个带字母的方块按钮,这个就是提示,也就是我们常说的8个基准键位,我…

spring boot多模块项目中父项目与子项目的连接

如题&#xff0c;spring boot多模块项目中&#xff0c;父项目在本级的pom.xml中&#xff0c;引入子项目&#xff0c;类似代码如下&#xff1a; ruoyi-modules/pom.xml&#xff1a; <modules><module>ruoyi-system</module><module>ruoyi-gen</modu…

【linux】详解vim编辑器

基本指令 【linux】详解linux基本指令-CSDN博客 【linux】详解linux基本指令-CSDN博客 vim的基本概念 vim有很多模式&#xff0c;小编只介绍三种就能让大家玩转vim了&#xff0c; 分别是&#xff1a; 正常/普通/命令模式 插入模式 末行/底行模式 命令模式 控制屏幕光标的…

【C++初阶】--- C++入门(上)

目录 一、C的背景及简要介绍1.1 什么是C1.2 C发展史1.3 C的重要性 二、C关键字三、命名空间2.1 命名空间定义2.2 命名空间使用 四、C输入 & 输出 一、C的背景及简要介绍 1.1 什么是C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&…

探索Linux中的神奇工具:探秘tail命令的妙用

探索Linux中的神奇工具&#xff1a;探秘tail命令的妙用 在Linux系统中&#xff0c;tail命令是一个强大的工具&#xff0c;用于查看文件的末尾内容。本文将详细介绍tail命令的基本用法和一些实用技巧&#xff0c;帮助读者更好地理解和运用这个命令。 了解tail命令 tail命令用…

Excel 下划线转驼峰

Excel 下划线转驼峰 LOWER(LEFT(SUBSTITUTE(PROER(A1),"_",""),1))&RIGHT(SUBSTITUTE(PROPER(A1),"_",""),LEN(SUBSTITUTE(PROPER(A1),"_",""))-1)

微博:一季度运营利润9.11亿元,经营效率持续提升

5月23日&#xff0c;微博发布2024年第一季度财报。一季度微博总营收3.955亿美元&#xff0c;约合28.44亿元人民币&#xff0c;超华尔街预期。其中&#xff0c;广告营收达到3.39亿美元&#xff0c;约合24.39亿元人民币。一季度调整后运营利润达到1.258亿美元&#xff0c;约合9.1…

【论文极速读】 LLava: 指令跟随的多模态大语言模型

【论文极速读】 LLava: 指令跟随的多模态大语言模型 FesianXu 20240331 at Tencent WeChat Search Team 前言 如何将已预训练好的大规模语言模型&#xff08;LLM&#xff09;和多模态模型&#xff08;如CLIP&#xff09;进行融合&#xff0c;形成一个多模态大语言模型&#xf…

【MATLAB】基于EMD-PCA-LSTM的回归预测模型

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 1 基本定义 基于EMD-PCA-LSTM的回归预测模型是一种结合了经验模态分解&#xff08;Empirical Mode Decomposition, EMD&#xff09;、主成分分析&#xff08;Principal Component Analysis, PCA&#xff09;和长短期记忆…

Arrays.asList()的问题记录

1、Arrays.asList() Arrays.asList()返回的是 public static <T> List<T> asList(T... a) {return new ArrayList<>(a);} private static class ArrayList<E> extends AbstractList<E>implements RandomAccess, java.io.Serializable 没有实现…

redis集群不允许操作多个key解决方案、redis key负载均衡方案

前提 在cluster redis 中进行同一个命令处理不同的key会报错:CROSSSLOT Keys in request dont hash to the same slot,例如: 此示例使用sdiff 命令对pool_1与pool_2进行diff操作。 那么我们在业务场景中就需要将集群redis中的不同key进行操作,我们该如何处理呢? 本次的…

CSS单行、同行文本左右对齐

再项目需求中&#xff0c;UI小姐姐常常要考虑项目的排版样式更简洁高级&#xff0c;常常会在项目设置内容或者字体两端对齐的效果&#xff0c;比如&#xff0c;在做表单时我们经常遇到让上下两个字段对齐的情况&#xff0c;比如姓名&#xff0c; 手机号码&#xff0c; 出生地等…

0406 组合放大电路

组合放大电路 共射-共基放大电路共集-共集放大电路 4.6.1 共射—共基放大电路 4.6.2 共集—共集放大电路 共射-共基放大电路 共集-共集放大电路 (a) 原理图 (b)交流通路 T1、T2构成复合管&#xff0c;可等效为一个NPN管

Docker搭建mysql性能测试环境

OpenEuler使用Docker搭建mysql性能测试环境 一、安装Docker二、docker安装mysql三、测试mysql连接 一、安装Docker 建立源文件vim /etc/yum.repos.d/docker-ce.repo增加内容[docker-ce-stable] nameDocker CE Stable - $basearch baseurlhttps://repo.huaweicloud.com/docker…

android GridLayout 布局详解,并举例

GridLayout 是 Android 中的一个布局容器&#xff0c;它允许你在一个二维网格中排列子视图。你可以指定网格的行数和列数&#xff0c;或者让 GridLayout 自动计算它们。每个子视图都可以占据一个或多个网格单元格。GridLayout 非常适合在需要创建规则网格的应用中使用&#xff…

【Power Compiler手册】1.工具介绍

第一部分: Power Compiler概念 以下是对Power Compiler工具的介绍主题: • Power Compiler工具介绍 • Power Compiler设计流程 • 电源建模和计算 1.Power Compiler工具介绍 Power Compiler工具是Synopsys Design Compiler综合工具家族的一部分。该工具执行寄存器传输级…

探索并发编程

引言 在现代软件开发中&#xff0c;尤其是面对高性能、高并发需求的应用场景&#xff0c;Java的并发编程能力显得尤为重要。Java提供了丰富的API和框架来支持开发者构建高效、可靠的多线程应用程序。本文将深入探讨Java并发编程的核心概念&#xff0c;重点讲解线程池的使用、F…

OpenAI、微软、智谱AI 等全球 16 家公司共同签署前沿人工智能安全承诺

人工智能&#xff08;AI&#xff09;的安全问题&#xff0c;正以前所未有的关注度在全球范围内被讨论。 日前&#xff0c;OpenAI 联合创始人、首席科学家 Ilya Sutskever 与 OpenAI 超级对齐团队共同领导人 Jan Leike 相继离开 OpenAI&#xff0c;Leike 甚至在 X 发布了一系列…

webpack5零基础入门-15样式兼容性问题处理

1.下载相关依赖 npm i postcss-loader postcss postcss-preset-env -D 2.在webpack.config.js中配置 注意&#xff1a;postcss-loader要在css-loader后面配置 3.写一个flex布局&#xff0c;flex是存在一定的兼容性问题的 4.打包 可以看到打包后未被处理 1.下载相关依赖 np…

MySQL 查询某个字段含有字母数字的值

在数据库管理中&#xff0c;常常需要查询某个字段包含特定类型数据的记录。本文将详细介绍如何在 MySQL 中查询某个字段含有字母和数字的值&#xff0c;并提供至少五个具体示例&#xff0c;帮助您更好地理解和应用这些查询方法。 1. 概述 在 MySQL 中&#xff0c;使用正则表达…