Vue 组件间的样式冲突污染


Posted in Javascript onAugust 31, 2017

一、污染是如何产生的?

得益于 Vue-loader,在 Vue 中可以使用类似于 Web Component 的组件化写法, <template></template><style></style><script></script> ,在大多数情况下,我们希望组件间定义的样式是相互隔离的,在 Weex 当中的确如此,组件天生隔离,可是在 Vue 当中,运行的载体还是浏览器,所有的样式类还是会通过 style 标签插入头部,影响全局,交叉污染

二、增加 Scoped 标识

依然是 Vue-loader,通过为组件中的 style 标签增加一个 scoped 标识,Vue-loader 在编译的过程中会为组件每一个元素节点增加 scopeId 作为属性,同时为所有的样式类加上属性选择器 scopeId,从而达到隔离的效果,大概是下面的样子:

每个组件有唯一的 scopeId,按理说,这样应该能够做到样式隔离了,实际上, 这种方式其实表现已经足够好了,除了以下这种情况~~

三、ScopeId 的继承

我们把上面的例子再完善下:

// 父组件
<template>
  <div>
    <div class="bg"></div>
    <Sub></Sub>
  </div>
</template>
<script>
  import Sub from './sub';
  export default {
    components: { Sub }
  };
</script>
<style scoped>
.bg {
  background-color: #000;
  width: 100px;
  height: 100px;
}
</style>

// 子组件
<template>
  <div class="bg">
  </div>
</template>
<script>
  export default {
  };
</script>
<style scoped>
.bg {
  width: 300px;
  height: 300px;
  margin-top: 5px;
}
</style>

由于我们使用了 scoped 标识进行样式隔离,子组件的 div 不应该有任何背景颜色,可是现实总在狠狠的打脸~~

Vue 组件间的样式冲突污染

不知道你的媚眼看到问题的所在了没:

子元素的 根元素 会继承父元素的 ScopeId!

子元素的 根元素 会继承父元素的 ScopeId!

子元素的 根元素 会继承父元素的 ScopeId!(说了三遍的话,肯定很重要)

由于子元素的 根元素 除了拥有自己的 ScopeId 属性,还继承了父元素的 ScopeId 属性,所以父元素的样式类 bg 对其依然有效

四、怎么破?

破解的方式也很简单,为每一个组件的根元素提供一个另类一点的样式名(如果有的话),例如就不要每个组件都命名为:wrap,根据业务名为:b1-wrap、b2-wrap 等

组件中的非根元素,类名不管怎么命名,怎么重名,都是不会发生污染的,这个自己领悟~~

五、这应当属于 Vue-loader 的一个 bug

没错,这应该是一个 bug,如果是我应该会怎么解呢,编译的时候不是增加属性,而是直接根据 scopeId 修改类名,嘿嘿~~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript对象、属性、事件手册集合方便查询
Jul 04 Javascript
浅析js中的浮点型运算问题
Jan 06 Javascript
JS生成不重复随机数组的函数代码
Jun 10 Javascript
Lab.js初次使用笔记
Feb 28 Javascript
老生常谈JavaScript数组的用法
Jun 10 Javascript
jQuery插件扩展操作入门示例
Jan 16 Javascript
Angular在一个页面中使用两个ng-app的方法(二)
Feb 20 Javascript
vue router 配置路由的方法
Jul 26 Javascript
vue使用ajax获取后台数据进行显示的示例
Aug 09 Javascript
微信小程序点击顶部导航栏切换样式代码实例
Nov 12 Javascript
javascript实现视频弹幕效果(两个版本)
Nov 28 Javascript
Vue-cli assets SubDirectory及PublicPath区别详解
Aug 18 Javascript
js实现加载页面就自动触发超链接的示例
Aug 31 #Javascript
JavaScript基础之流程控制语句的用法
Aug 31 #Javascript
jquery操作ul的一些操作笔记整理(干货)
Aug 31 #jQuery
浅谈在fetch方法中添加header后遇到的预检请求问题
Aug 31 #Javascript
浅谈vue的踩坑路
Aug 31 #Javascript
对存在JavaScript隐式类型转换的四种情况的总结(必看篇)
Aug 31 #Javascript
[js高手之路]HTML标签解释成DOM节点的实现方法
Aug 31 #Javascript
You might like
AM/FM收音机的安装与调试
2021/03/02 无线电
php Memcache 中实现消息队列
2009/11/24 PHP
基于PHP文件操作的详细诠释
2013/06/21 PHP
php中error与exception的区别及应用
2014/07/28 PHP
Cygwin中安装PHP方法步骤
2015/07/04 PHP
Laravel 修改验证异常的响应格式实例代码详解
2020/05/25 PHP
JS 实现完美include载入实现代码
2010/08/05 Javascript
3分钟写出来的Jquery版checkbox全选反选功能
2013/10/23 Javascript
node.js中使用socket.io的方法
2014/12/15 Javascript
详解Angular2 之 结构型指令
2017/06/21 Javascript
Angular实现响应式表单
2017/08/04 Javascript
vue动画打包后失效问题的解决方法
2018/09/18 Javascript
Vue.js更改调试地址端口号的实例
2018/09/19 Javascript
vue实现压缩图片预览并上传功能(promise封装)
2019/01/10 Javascript
Vue2.0 ES6语法降级ES5的操作
2020/10/30 Javascript
微信小程序自定义modal弹窗组件的方法详解
2020/12/20 Javascript
Python列表list解析操作示例【整数操作、字符操作、矩阵操作】
2017/07/25 Python
python通过伪装头部数据抵抗反爬虫的实例
2018/05/07 Python
Python 爬虫之Beautiful Soup模块使用指南
2018/07/05 Python
详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
2019/04/17 Python
对python中url参数编码与解码的实例详解
2019/07/25 Python
numpy:找到指定元素的索引示例
2019/11/26 Python
Python使用psutil获取进程信息的例子
2019/12/17 Python
如何理解Python中包的引入
2020/05/29 Python
python自动生成sql语句的脚本
2021/02/24 Python
HTML5 Canvas实现玫瑰曲线和心形图案的代码实例
2014/04/10 HTML / CSS
大学生标准推荐信范文
2013/11/25 职场文书
行政总经理岗位职责
2013/12/05 职场文书
会议邀请书范文
2014/02/02 职场文书
工艺工程师岗位职责
2014/03/04 职场文书
教师节活动主持词
2014/04/02 职场文书
慈善募捐倡议书
2015/04/27 职场文书
追讨欠款律师函
2015/06/24 职场文书
《开国大典》教学反思
2016/02/16 职场文书
python b站视频下载的五种版本
2021/05/27 Python
Python中re模块的元字符使用小结
2022/04/07 Python