跳转至

::v-deep和/deep/和的区别是什么

在 Vue 2(包括 Vue 2 + scoped 样式)中,:deep()(或 ::v-deep/deep/)用于 穿透 scoped 样式,让 CSS 作用于子组件的深层结构。它们主要的区别如下:


1. /deep/(已废弃,不推荐)

/deep/ 最早是 Vue 2 中用于穿透 scoped 样式的写法,本质上是 CSS 的 >>> 语法,后来被浏览器废弃。

示例

<style scoped>
/deep/ .child-class {
  color: red;
}
</style>
⚠️ 缺点: - vue-loader 现在会 自动转换 /deep/:deep(),但在某些环境下可能无法使用。 - 不推荐,因为它已被废弃。


2. ::v-deep(推荐使用)

::v-deep 是 Vue 2.7 及 Vue 3 官方推荐的深度作用选择器,专门用于替代 /deep/

示例

<style scoped>
::v-deep(.child-class) {
  color: red;
}
</style>
✅ 优势: - Vue 2.7 及 Vue 3 推荐使用 - vue-loader 仍然支持 ::v-deep - 在 Vue 3 中,::v-deep 更加标准化


3. :deep()(Vue 3 主要使用)

Vue 3 主要推荐 :deep(),它是 ::v-deepCSS 变量格式

示例

<style scoped>
:deep(.child-class) {
  color: red;
}
</style>
✅ 优势: - Vue 3 官方推荐的方式 - 更符合现代 CSS 语法


🔥 总结

语法 Vue 2 Vue 3 推荐程度
/deep/ 兼容,但已废弃 ❌ 不支持 ❌ 不推荐
::v-deep ✅ 支持 ✅ 支持 ⚠️ Vue 3 不推荐,但可用
:deep() ❌ Vue 2 不支持 ✅ Vue 3 推荐 ✅ 推荐使用

如果你 只在 Vue 2 项目中开发,建议使用 ::v-deep,如果以后要 升级 Vue 3,可以直接用 :deep()