Vue3中 :deep() 与 :deep 用法区别解析

在 Vue 3 的 Scoped CSS 中,:deep() 用于穿透样式作用域(样式穿透),其括号的使用有明确区别:

1. 有括号::deep(selector)(推荐写法)

css

复制

下载

:deep(.child-class) { 
  color: red;
}
  • ✅ 正确用法:将需要穿透的选择器放入括号内

  • ✅ 编译后生成类似 [data-v-xxx] .child-class 的选择器

  • ✅ Vue 3.3+ 官方推荐写法(无括号写法已被标记为废弃)

2. 无括号::deep selector(废弃写法)

css

复制

下载

:deep .child-class { 
  color: red;
}
  • ⚠️ 已被废弃(Vue 3.3+ 会警告)

  • ❌ 编译后生成 [data-v-xxx] .child-class(效果相同但语法不标准)

  • ❌ 未来版本可能被移除

3. ⚠️ 历史写法:::v-deep(Vue 2 兼容)

css

复制

下载

/* Vue 2 方式 (已废弃) */
::v-deep .el-dialog__body {
  padding: 15px;
}
  • 在 Vue 3 中仍可用但已被标记为废弃

  • 推荐迁移到 :deep() 语法


关键区别总结:

特性:deep(selector)(有括号):deep selector(无括号)
语法正确性✅ Vue 3.3+ 官方推荐⚠️ 已被废弃(兼容旧项目)
编译结果相同([data-v-xxx] selector相同(但会触发警告)
未来兼容性安全可能在未来版本失效
代码规范符合 CSS 伪类标准(如 :not()不符合标准伪类写法

正确用法示例:

vue

复制

下载

<style scoped>
/* 穿透到子组件内的元素 */
.parent :deep(.child-element) {
  padding: 10px;
}

/* 穿透到插槽内容 */
:deep(slot-content) {
  background: yellow;
}
</style>

迁移建议:

  • 新项目一律使用 :deep(selector)

  • 旧项目升级 Vue 3.3+ 后,用 ESLint 的 vue/no-deprecated-deep-selector 规则自动替换无括号写法

💡 其他穿透语法

  • 插槽内容穿透 → :slotted(.slot-class)

  • 全局样式 → :global(.global-class)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值