当前位置: 首页 > article >正文

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

升级 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)?.$?.provides
  const instance = getCurrentInstance()
  const app = instance?.appContext.app
  if (app && provides) {
    const keys = [
      namespaceContextKey,
      emptyValuesContextKey,
      localeContextKey,
      zIndexContextKey,
      SIZE_INJECTION_KEY
    ]
    keys.forEach(key => {
      provides[key] && app.provide(key, provides[key])
    })
  }
})
</script>


http://www.kler.cn/news/362458.html

相关文章:

  • Node.js是什么? 能做什么?
  • 列表、元组、集合、字典和 pandas 数据框(DataFrame)之间的数据转换
  • 【性能优化】安卓性能优化之CPU优化
  • 在linux上安装r-base和rpy2到conda环境
  • Flink 窗口触发器Triggers
  • 超简洁的B端系统,还是看国外的设计.
  • curl,nc和telnet的用法以及其他常用工具(nc代理与重定向)
  • MySQL - Navicat自动备份MySQL数据
  • JVM-编译期处理与Java语法糖
  • 如何在 HarmonyOS NEXT 中使用 @Builder 装饰器优化 UI 组件的复用?
  • 金仓数据库×武汉人社:共塑大数据应用智慧平台
  • 论文阅读_大型语言模型增强强化学习调查
  • 使用QueryWrapper中IN关键字超过1000个参数后如何处理
  • Redis的Bin目录文件及常用命令
  • mapping source must be pairs of fieldnames and properties definition 解决方案
  • 桥接、NAT和仅主机三种网络模式对虚拟机IP地址分配的影响
  • 【Spring篇】Spring中的Bean管理
  • Ribbon客户端负载均衡策略测试及其改进
  • Leetcode 721. 账户合并
  • tomcat安装启动配置以及乱码问题
  • Request2:Post请求和Json
  • Leetcode—192. 统计词频【中等】(Shell)
  • VMamba:视觉SSM
  • 【CICD运维】GitLab + Shell + Minio实现应用程序自动打包,自动生成版本号,并且上传到Minio对象存储系统归档保存
  • 【Golang】Go语言中如何创建Cron定时任务
  • 基于vue框架的的二手车交易系统的设计与实现thx7v(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。