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下查找父节点的简单方法
Aug 13 Javascript
jQuery 跨域访问问题解决方法
Dec 02 Javascript
解析JavaScript中delete操作符不能删除的对象
Dec 03 Javascript
jQuery如何实现点击页面获得当前点击元素的id或其他信息
Jan 09 Javascript
js中style.display=&quot;&quot;无效的解决方法
Oct 30 Javascript
jqTransform美化表单
Oct 10 Javascript
原生JS实现首页进度加载动画
Sep 14 Javascript
Javascript中this绑定的3种方法与比较
Oct 13 Javascript
Ajax跨域实现代码(后台jsp)
Jan 21 Javascript
Vuex模块化实现待办事项的状态管理
Mar 15 Javascript
Bootstrap图片轮播效果详解
Oct 17 Javascript
原生js实现随机点名功能
Nov 05 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
php利用事务处理转账问题
2015/04/22 PHP
PHP实现字母数字混合验证码功能
2019/07/11 PHP
document.forms[].submit()使用介绍
2014/02/19 Javascript
利用JavaScript检测CPU使用率自己写的
2014/03/22 Javascript
实例讲解JS中数组Array的操作方法
2014/05/09 Javascript
Javascript判断图片尺寸大小实例分析
2014/06/16 Javascript
JavaScript访问CSS属性的几种方式介绍
2014/07/21 Javascript
JQuery实现鼠标移动图片显示描述层的方法
2015/06/25 Javascript
使用jQuery在对象中缓存选择器的简单方法
2015/06/30 Javascript
超精准的javascript验证身份证号的具体实现方法
2015/11/18 Javascript
jquery.validate使用详解
2016/06/02 Javascript
JQuery异步加载PartialView的方法
2016/06/07 Javascript
js 计算图片内点个数的示例代码
2019/04/04 Javascript
JS数组的常用10种方法详解
2020/05/08 Javascript
js实现直播点击飘心效果
2020/08/19 Javascript
[02:15]你好,这就是DOTA!
2015/08/05 DOTA
详解Python 实现元胞自动机中的生命游戏(Game of life)
2018/01/27 Python
Python Django2.0集成Celery4.1教程
2019/11/19 Python
tensorflow指定GPU与动态分配GPU memory设置
2020/02/03 Python
Django Model中字段(field)的各种选项说明
2020/05/19 Python
Python接收手机短信的代码整理
2020/08/02 Python
python用700行代码实现http客户端
2021/01/14 Python
美国男装连锁零售商:Men’s Wearhouse
2016/10/14 全球购物
手工制作的音乐盒:Music Box Attic
2019/09/05 全球购物
商务会议邀请函
2014/01/09 职场文书
职工趣味运动会方案
2014/02/10 职场文书
上课看小说检讨书
2014/02/22 职场文书
开展党的群众路线教育实践活动总结报告
2014/10/31 职场文书
2014年小学校长工作总结
2014/12/08 职场文书
先进个人评语大全
2015/01/04 职场文书
2015年保卫科工作总结
2015/05/14 职场文书
环保证明
2015/06/23 职场文书
军训后的感想
2015/08/07 职场文书
开学随笔
2015/08/15 职场文书
详解python的内存分配机制
2021/05/10 Python
Tomcat starup.bat 脚本实现开机自启动
2022/04/20 Servers