Vue 中的 deep、v-deep 和 >>>区别解析

 更新时间:2026年02月04日 08:48:48   作者:林恒  
文章主要介绍了在Vue中使用UI库时,如何通过样式穿透(style penetration)来修改子组件的样式,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

🧑‍💻 写在开头

“你用 Element Plus 写了个按钮,想改下 hover 颜色,结果死活不生效!最后查了半天,发现得加个 :deep() 才行”

其实,这是 Vue 中一个非常常见的坑:样式作用域冲突。那为什么用 UI 库时,加上 :deep()::v-deep 或 >>>后,样式就能生效呢?

它们是什么?有什么区别?什么时候该用哪个?

一、先说背景

我们在 Vue 单文件组件(.vue 文件)里写样式时,通常会加上 scoped 属性:

<template>
  <el-button>点我</el-button>
</template>
<style scoped>
.el-button {
  background: red;
}
</style>

加了 scoped 后,Vue 会自动给这个组件里的所有元素加上一个唯一的属性(比如 data-v-123456),然后把 CSS 选择器也加上这个属性,变成:

.el-button[data-v-123456] {
  background: red;
}

这样做的好处是:样式只作用于当前组件,不会污染全局。、

但问题来了:Element Plus 的 <el-button> 组件内部结构,是在它自己的组件里定义的。也就是说,你写的 .el-button 元素,其实是 Element Plus 渲染出来的子组件,它身上没有你当前组件的 data-v-xxx 属性!

所以你的样式根本匹配不到它,自然就失效了。

二、那怎么办?

为了解决这个问题,Vue 提供了样式穿透(style penetration)的语法,让你能穿透当前组件的作用域,去影响子组件内部的元素。

Vue 社区出现过三种写法:

下面我们一个个拆解。

1. >>>:曾经的快捷方式,但问题很多

早期 Vue2 时代,很多人用:

<style scoped>
.parent >>> .child {
  color: blue;
}
</style>

它的意思是:从 .parent 开始,穿透到所有后代中的 .child

但问题在于:

  • Sass/Less 等预处理器不认 >>>,会报错。
  • 不是标准 CSS 语法。
  • Vue3 已经明确不再支持。

所以现在基本可以忘掉它了。

2. ::v-deep:Vue2 到 Vue3 的桥梁

为了兼容预处理器,Vue 引入了 ::v-deep

<style scoped lang="scss">
.parent ::v-deep(.child) {
  color: blue;
}
</style>

或者更常见的写法:

<style scoped lang="scss">
.parent ::v-deep(.child) {
  color: blue;
}
</style>

它在 Vue2 和 Vue3 中都能用,算是一个安全的过渡方案。

但注意:在 Vue3 中,官方文档已经明确建议使用 :deep() 替代它。

3. :deep():Vue3 的标准答案

Vue3 引入了更简洁、更符合 CSS 规范的伪类函数写法:

<style scoped>
:deep(.el-button) {
  background: red !important;
}
</style>

或者配合父级选择器:

<style scoped>
.my-wrapper :deep(.el-input__inner) {
  border-radius: 10px;
}
</style>

优点

  • 语法清晰,像原生 CSS。
  • 支持所有预处理器(Sass/Less/Stylus)。

:deep() 本质上是一个编译时转换,Vue 在构建时会把它展开成带 data-v-xxx 的复杂选择器,从而实现穿透。

三、怎么正确修改 Element Plus 的样式?

举个真实例子:你想把 Element Plus 的输入框圆角改成 8px。

错误写法(不生效):

<style scoped>
.el-input__inner {
  border-radius: 8px;
}
</style>

正确写法:

<template>
  <div class="my-form">
    <el-input v-model="value" />
  </div>
</template>
<style scoped>
.my-form :deep(.el-input__inner) {
  border-radius: 8px;
}
</style>

为什么要加 .my-form 这个父级?

避免全局污染!如果直接写 :deep(.el-input__inner),那么这个页面里所有 Element 输入框都会被改掉。加上父级限定,就能精准控制范围。

到此这篇关于Vue 中的 deep、v-deep 和 &gt;&gt;&gt;区别解析的文章就介绍到这了,更多相关Vue deep、v-deep 和 &gt;&gt;&gt; 区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue UI框架的主题切换功能实现

    Vue UI框架的主题切换功能实现

    在如今,很多网页已经可以手动切换明亮模式和黑暗模式,网页的主题切换已经成为了一个常用的需求,因此,本文将从常见框架的处理方式总结一些相关的操作,对vue ui框架主题切换功能感兴趣的朋友跟随小编一起看看吧
    2022-12-12
  • 安装vue-cli的简易过程

    安装vue-cli的简易过程

    安装vue-cli的前提是你已经安装了npm,安装npm你可以直接下载node的安装包进行安装。接下来通过本文给大家介绍安装vue-cli的简易过程,感兴趣的朋友跟随脚本之家小编一起学习吧
    2018-05-05
  • element-plus dialog v-loading不生效问题及解决

    element-plus dialog v-loading不生效问题及解决

    这篇文章主要介绍了element-plus dialog v-loading不生效问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 如何在Vue3中实现文件上传功能结合后端API

    如何在Vue3中实现文件上传功能结合后端API

    文件上传的功能实现是我们做Web应用时候最为常见的应用场景,下面这篇文章主要给大家介绍了关于如何在Vue3中实现文件上传功能结合后端API的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-09-09
  • vue事件修饰符和按键修饰符用法总结

    vue事件修饰符和按键修饰符用法总结

    本篇文章主要介绍了vue事件修饰符和按键修饰符用法总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 一篇文章带你了解vue.js的事件循环机制

    一篇文章带你了解vue.js的事件循环机制

    这篇文章主要为大家详细介绍了vue.js事件循环机制,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • vue使用$attrs和$listeners多级组件嵌套传递数据

    vue使用$attrs和$listeners多级组件嵌套传递数据

    这篇文章主要为大家介绍了vue使用$attrs和$listeners多级组件嵌套传递数据示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Vue中Table组件行内右键菜单实现方法(基于 vue + AntDesign)

    Vue中Table组件行内右键菜单实现方法(基于 vue + AntDesign)

    这篇文章主要介绍了Vue中Table组件行内右键菜单实现方法,该项目是基于 vue + AntDesign的,具体实例代码给大家介绍的非常详细 ,需要的朋友可以参考下
    2019-11-11
  • 谈谈对vue响应式数据更新的误解

    谈谈对vue响应式数据更新的误解

    本篇文章主要介绍了谈谈对vue响应式数据更新的误解,深入了解了vue响应式数据,有兴趣的可以了解一下
    2017-08-08
  • vue实现前端excel导出的三种方法实现与对比总结

    vue实现前端excel导出的三种方法实现与对比总结

    在Vue项目中实现前端Excel导出功能,主要有三种主流方案,各有特点,下面小编就为大家详细介绍一下这三种方法的实现,大家可以根据需要进行选择
    2025-10-10

最新评论