vue-router钩子中调用ElMessage等样式出错

ops/2024/11/14 21:09:36/

升级 vue@3.5 时遇到奇怪的问题, 页面点击离开没反应
经过排查, 是以下几点相互作用导致此问题

  1. vue 有应用上下文的概念, 例如 runWithContext API,
  2. vue-router 在调用钩子时会获取 vue 的应用上下文
  3. element-plus 在唤起弹窗时会从 parent 或 应用上下文上拿到 config 信息
  4. element-plus 使用了 namespace 功能, 样式表里的类名会从 el-xxx 变为 custom-xxxx

在 vue-router 的钩子里唤起 element-plus 弹窗的行为在 vue@3.4 和 vue@3.5 中出现不同结果
一个能正常获取到 config, 一个获取不到使用了默认值, 由于默认config 创建出来的 dom 没有对应的样式表, 页面上感觉就是没反应了
在这里插入图片描述

复现环境:

// package.json
"element-plus": "^2.8.3",
"vue": "^3.5.8",
"vue-router": "^4.4.5",
复现代码
// 全局引入 element-plus 样式
@forward 'element-plus/theme-chalk/src/mixins/config.scss' with ($namespace: 'custom-el'
);
@use 'element-plus/theme-chalk/src/index.scss' as *;

在这里插入图片描述
请添加图片描述

解决方案:

注册 el-config-provider 后, 手动获取到 config 的provide 信息, 注册到应用上下文中

<template><el-config-provider ref="appElConfigProviders" v-bind="config"><router-view /></el-config-provider>
</template><script setup lang="ts">
defineOptions({name: 'App'
})import {namespaceContextKey,emptyValuesContextKey,localeContextKey,zIndexContextKey,SIZE_INJECTION_KEY
} from 'element-plus'const config = {namespace: 'bms-el',emptyValues: ['', undefined, null],valueOnClear: null
}const appElConfigProviders = useTemplateRef('appElConfigProviders')onMounted(() => {const provides = unref(appElConfigProviders)?.$?.providesconst instance = getCurrentInstance()const app = instance?.appContext.appif (app && provides) {const keys = [namespaceContextKey,emptyValuesContextKey,localeContextKey,zIndexContextKey,SIZE_INJECTION_KEY]keys.forEach(key => {provides[key] && app.provide(key, provides[key])})}
})
</script>

http://www.ppmy.cn/ops/125985.html

相关文章

uni-app如何搭建项目(一步一步教程)

来来来&#xff0c;看这里 uni-app新建项目教程uni-app项目结构 首先我们要有一个HBuilder这个软件&#xff0c;然后我们来搭建uni-app项目 uni-app新建项目教程 首先我们打开这个HBuilder软件&#xff0c;好我们就出现这个界面&#xff0c;我们点击新建项目   然后我们选择…

Android复杂问题分析工具bugreportz详解

文章目录 bugreportz详细介绍功能与作用使用方法生成详细报告检查进度bugreportz 的优势分析报告 如何分析1. 解压 ZIP 文件2. 分析主要文件2.1 bugreport.txt2.2 logcat.txt2.3 kernel.log / last_kmsg2.4 events.log2.5 traces.txt2.6 dumpstate_board.txt 3. 工具支持4. 重点…

SpringBoot开发的桂林旅游路线规划器

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

【微服务】微服务发现详解:构建高效分布式系统的关键

目录 引言一、什么是微服务发现&#xff1f;1.1 微服务发现的分类 二、服务注册中心2.1 服务注册流程 三、服务发现流程四、微服务发现的实现方式4.1 Eureka 示例4.2 Consul 示例4.3 Zookeeper 示例4.4 Kubernetes 示例4.5 服务健康检查与稳定性 五、微服务发现的优缺点5.1 动态…

Redis 数据类型string(字符串)

目录 1 基本特性 2 主要操作命令 2.1 设置键值 2.1.1 SET key value [EX seconds] [PX milliseconds] [NX|XX] 2.1.2 MSET key value [key value ...] 2.1.3 SETEX key seconds value 2.1.4 PSETEX key milliseconds value 2.1.5 APPEND key value 2.2 获取键值 …

android stadio

build 时 pom文件无法下载解决 Android Studio Gradle build 报错&#xff1a;Received status code 400 from server: Bad Request - qq874455953 - 博客园

10年后手机有多科幻?清华孙茂松:人手一个超级大脑,诊病翻译搞研发

人工智能对我们的生活影响有多大? 看到这个问题,肯定会有人觉得很奇怪。 人工智能什么时候改变我们的生活了?我的贾维斯呢?我的科塔娜呢?我甚至都没要你把哆啦A梦做出来。 虽然像科幻小说和电影里那种栩栩如生到能够通过图灵测试的强人工智能确实还只存在于纸面上,但是…

初始Python篇(3)—— 列表

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 列表相关概念 列表的创建与删除 列表的遍历 操作列表的相关方法 列表的排序 列表生成式 二维列表 创建二维列表 遍…