关于vue在添加scoped后修改第三方ui组件或者其他样式不生效

废话

最近一个项目,因为vue的实际开发经验少,一直修改el-table样式失效,苦苦找不到原因折磨死我了,啊啊啊啊啊!!!最后多方查找才找到其原因,痛煞老

原因

我们常常在组件中加入scoped来防止组件间的样式污染,而scoped就是罪魁祸首,我们先说scoped的原理

scoped的原理

在组件添加了scoped后发生的变化

  • vue会在dom节点加入一个data-v-xxxxx的属性
  • 在编译css后,会在其后最后一个选择器加入[data-v-xxxxx]形成属性选择器
  • 因为每个组件的data-v-xxxxx是唯一的,所以scoped起到管理样式,防止样式污染的作用

在dom节点中打入属性

对于本组件的dom节点和其子组件的根节点都会打入属性(只有根节点)

其引入的el-table是属于子组件,所以下面第二张图有两个div被打入属性

编译css时打入相应属性

添加scoped后,我们会在选择器后加入属性变成属性选择器

如用上面的程序的类名示例

css 复制代码
//编译前
.div_{
background:#000;
}
//编译后
.div_[data-v-0b22be8e]{
background:#000;
}

这样就可以防止组件间的样式污染,达到只对于本组件生效

对于第三方组件样式不生效原因

以上说了打入scoped打入属性的范围和css编译的变化我们就可以很快的理解

如下创建了一个子组件

将这个子组件引入了一个添加了scoped的父组件中

其在效果是这样的

可以看到其根节点div被打入了父组件的属性,父组件的样式以下

但最后结果显示是这样的

可以看到我们修改第三方ui失败,因为父组件中的样式是被打入属性的,而子组件span是没有属性的,所以选择器无法选择到span,所以修改失败

css 复制代码
//父组件的样式是被编译成
.test span[data-v-47dbdb26]{
color:#ff0000
}

样式穿刺解决无法修改问题

在这里介绍三种穿刺方法

对于css可用

css 复制代码
// 使用>>>
.test >>> span{
color:#ff0000
}

对于sass和less可用

css 复制代码
// 使用/deep/
.test{
/deep/ span{
color:#ff0000
}
}


//在一些情况下无法使用可以使用::v-deep
.test{
::v-deep span{
color:#ff0000
}
}
css 复制代码
//其编译结果都为
.test[data-v-47dbdb26] span{
color:#ff0000
}

对于样式穿刺解决问题的原理相信大家都看出来了,就是在css编译时,不让父组件的属性结合样式穿刺器后选择器,从而达到穿刺到子组件的目的进而对样式进行修改

相关推荐
STUPID MAN2 小时前
Linux使用tomcat发布vue打包的dist或html
linux·vue.js·tomcat·html
JIngJaneIL3 小时前
助农惠农服务平台|助农服务系统|基于SprinBoot+vue的助农服务系统(源码+数据库+文档)
java·前端·数据库·vue.js·论文·毕设·助农惠农服务平台
云外天ノ☼3 小时前
待办事项全栈实现:Vue3 + Node.js (Koa) + MySQL深度整合,构建生产级任务管理系统的技术实践
前端·数据库·vue.js·mysql·vue3·koa·jwt认证
一位搞嵌入式的 genius3 小时前
前端实战开发(三):Vue+Pinia中三大核心问题解决方案!!!
前端·javascript·vue.js·前端实战
前端.火鸡3 小时前
Vue 3.5 新API解析:响应式革命、SSR黑科技与开发体验飞跃
javascript·vue.js·科技
嗝屁小孩纸3 小时前
开发集成热门小游戏(vue+js)
前端·javascript·vue.js
小光学长3 小时前
基于Vue的智慧楼宇报修平台设计与实现066z15wb(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js
胖虎2655 小时前
基于 Vue3+TypeScript+Vant 的评论组件开发实践
vue.js
user_admin_god7 小时前
基于Layui Vue Admin + Spring Boot 3.x 的企业级前后端分离管理系统
vue.js·spring boot·layui
李剑一7 小时前
mitt和bus有什么区别
前端·javascript·vue.js