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

【Vue bug】:deep()失效

vue 组件中使用了 element-plus 组件

<template><el-dialog:model-value="visible":title="title":width="width + 'px'":before-close="onClose"><div class="container" :style="{height:height + 'px'}"><slot name="content"></slot></div><template #footer><div class="dialog-footer"><el-button plain type="danger" @click="onClose">取消</el-button><el-button plain type="primary" @click="onConfirm">确定</el-button></div></template></el-dialog>
</template>
<style lang="scss" scoped>
// 组件内自定义的 elementplus 的样式,
:deep(.el-dialog){border-radius: 10px!important;background-color: #535bf2;
}

使用了:deep()失效

bug 剖析

1. 组件的样式与第三方子组件样式的加载顺序

  • 若第三方子组件是完全引入的,比如 element-plus:子组件在应用启动的时候,样式就加载了
  • 若第三方子组件是按需导入的,那么先加载组件,然后加载子组件。

2. 样式中scoped

当在一个Vue SFC的<style>标签中添加scoped属性时,Vue编译器会为该组件内的所有元素添加一个唯一的属性(例如data-v-f3f3eg9),同时修改样式规则以匹配这个属性。这意味着这些样式只会应用于当前组件内的元素,而不会影响全局或其他组件中的相同类名或标签。
示例:

<template><div class="example">Hello, scoped CSS!</div>
</template><style scoped>
.example {color: red;
}
</style>

编译后可能会变成类似这样:

<template><div class="example" data-v-f3f3eg9>Hello, scoped CSS!</div>
</template><style>
.example[data-v-f3f3eg9] {color: red;
}
</style>

3. :deep()失效原因

<template><el-dialog:model-value="visible":title="title":width="width + 'px'":before-close="onClose"><div class="container" :style="{height:height + 'px'}"><slot name="content"></slot></div><template #footer><div class="dialog-footer"><el-button plain type="danger" @click="onClose">取消</el-button><el-button plain type="primary" @click="onConfirm">确定</el-button></div></template></el-dialog>
</template>
<style lang="scss" scoped>
// 组件内自定义的 elementplus 的样式,
:deep(.el-dialog){border-radius: 10px!important;background-color: #535bf2;
}
  1. 子组件是完全引入的,那么先加载子组件,后加载该组件。
  2. 组件的<template></template>中只含有子组件,那么组件的样式会覆盖子组件的样式
  3. 加载父组件的时候,由于子组件已加载完成,Vue 编译器无法为组件中的元素(即子组件)添加唯一属性,也就无法将组件的样式绑定到子组件。
    故,使用:deep(),样式依然失效。

解决办法

在组件的<template></template>中,将子组件放入到<div></div>标签中,那么在加载组件的时候,组件的样式会绑定到<div></div>标签上。

<template><div><el-dialog:model-value="visible":title="title":width="width + 'px'":before-close="onClose"><div class="container" :style="{height:height + 'px'}"><slot name="content"></slot></div><template #footer><div class="dialog-footer"><el-button plain type="danger" @click="onClose">取消</el-button><el-button plain type="primary" @click="onConfirm">确定</el-button></div></template></el-dialog></div>
</template>
http://www.xdnf.cn/news/3340.html

相关文章:

  • 如何提升自我执行力?
  • 拆解 browser-use 项目——深入理解 Agent 层
  • Linux 环境下 Mysql 5.7 数据定期备份
  • Kotlin-运算符重载函数
  • 生产级RAG系统一些经验总结
  • HTN77A0原理图提供聚能芯半导体禾润一级代理技术支持免费送样
  • 1295.统计位数为偶数的数字
  • SWIG 和 JNA / JNI 等 C 接口封装工具及进行 C 接口的封装
  • AnimateCC基础教学:二次贝塞尔曲线的绘制。
  • Android 动态权限申请
  • 多通道经颅电刺激器的主流厂家介绍
  • hadoop集群建立
  • 【keil使用】无法打开keil工程,只有空白界面的解决方法
  • rk3568安全启动功能实践
  • 介绍一下Files类的常用方法
  • 车辆检测新突破:VFM-Det 如何用大模型提升识别精度
  • LVGL -按键介绍 上
  • Nginx 重写与重定向配置
  • SpringBoot集成Druid启动报错testWhileIdle is true, validationQuery not set
  • 【功能】根据时区获取开服天数
  • 4:机器人目标识别无序抓取程序二次开发
  • 深度学习正则化:原理、方法与应用深度解析
  • 【Linux服务器安装杀毒软件】
  • 利用v0与Cursor优化开发流程和效率
  • Unity 粒子同步,FishNet
  • 高等数学-第七版-下册 选做记录 习题9-6
  • 2025年4月AI科技领域周报(4.21-4.27):大模型生态加速演进 通用AI开启产业融合新范式
  • Java批量数据处理唯一ID生成优化
  • 如何用AI生成假期旅行照?
  • CUDA编程 - 如何使用 CUDA 流在 GPU 设备上并发执行多个内核 - 如何应用到自己的项目中 - concurrentKernels