Vue 中的 deep、v-deep 和 >>> 有什么区别?什么时候该用
点赞 收藏 学会“你用Element Plus写了个按钮想改下 hover 颜色结果死活不生效最后查了半天发现得加个:deep()才行”其实这是 Vue 中一个非常常见的坑样式作用域冲突。那为什么用 UI 库时加上:deep()、::v-deep或后样式就能生效呢它们是什么有什么区别什么时候该用哪个一、先说背景我们在 Vue 单文件组件.vue文件里写样式时通常会加上scoped属性123456789templateel-button点我/el-button/templatestyle scoped.el-button {background: red;}/style加了scoped后Vue 会自动给这个组件里的所有元素加上一个唯一的属性比如data-v-123456然后把 CSS 选择器也加上这个属性变成123.el-button[data-v-123456] {background: red;}这样做的好处是样式只作用于当前组件不会污染全局。、但问题来了Element Plus 的el-button组件内部结构是在它自己的组件里定义的。也就是说你写的.el-button元素其实是 Element Plus 渲染出来的子组件它身上没有你当前组件的data-v-xxx属性所以你的样式根本匹配不到它自然就失效了。二、那怎么办为了解决这个问题Vue 提供了样式穿透style penetration的语法让你能穿透当前组件的作用域去影响子组件内部的元素。Vue 社区出现过三种写法下面我们一个个拆解。1.曾经的快捷方式但问题很多早期 Vue2 时代很多人用12345style scoped.parent .child {color: blue;}/style它的意思是从.parent开始穿透到所有后代中的.child。但问题在于Sass/Less 等预处理器不认会报错。不是标准 CSS 语法。Vue3 已经明确不再支持。所以现在基本可以忘掉它了。2.::v-deepVue2 到 Vue3 的桥梁为了兼容预处理器Vue 引入了::v-deep12345style scoped langscss.parent ::v-deep(.child) {color: blue;}/style或者更常见的写法12345.parent {::v-deep(.child) {color: blue;}}它在 Vue2 和 Vue3 中都能用算是一个安全的过渡方案。但注意在 Vue3 中官方文档已经明确建议使用:deep()替代它。3.:deep()Vue3 的标准答案Vue3 引入了更简洁、更符合 CSS 规范的伪类函数写法12345style scoped:deep(.el-button) {background: red !important;}/style或者配合父级选择器12345style 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。错误写法不生效12345style scoped.el-input__inner {border-radius: 8px;}/style正确写法1234567891011templatedivclassmy-formel-input v-modelvalue//div/templatestyle scoped.my-form :deep(.el-input__inner) {border-radius: 8px;}/style为什么要加.my-form这个父级避免全局污染如果直接写:deep(.el-input__inner)那么这个页面里所有 Element
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2470698.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!