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 拾碎[三] 使用className属性
Oct 16 Javascript
js实现绿白相间竖向网页百叶窗动画切换效果
Mar 02 Javascript
js简单的点击返回顶部效果实现方法
Apr 10 Javascript
js实现类似jquery里animate动画效果的方法
Apr 10 Javascript
jQuery监控文本框事件并作相应处理的方法
Apr 16 Javascript
纯javascript制作日历控件
Jul 17 Javascript
BootStrap使用file-input插件上传图片的方法
Sep 05 Javascript
jQuery 选择符详细介绍及整理
Dec 02 Javascript
原生js实现仿window10系统日历效果的实例
Oct 31 Javascript
Vue触发式全局组件构建的方法
Nov 28 Javascript
微信小程序wepy框架学习和使用心得详解
May 24 Javascript
非常实用的jQuery代码段集锦【检测浏览器、滚动、复制、淡入淡出等】
Aug 08 jQuery
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
用Zend Studio+PHPnow+Zend Debugger搭建PHP服务器调试环境步骤
2014/01/19 PHP
php smarty truncate UTF8乱码问题解决办法
2014/06/13 PHP
php+layui数据表格实现数据分页渲染代码
2019/10/26 PHP
Javascript模块化编程(一)模块的写法最佳实践
2013/01/17 Javascript
JavaScript动态改变HTML页面元素例如添加或删除
2014/08/10 Javascript
node.js适合游戏后台开发吗?
2014/09/03 Javascript
jQuery实现瀑布流的取巧做法分享
2015/01/12 Javascript
JavaScript如何动态创建table表格
2020/08/02 Javascript
Javascript设计模式之观察者模式(推荐)
2016/03/29 Javascript
jQuery动态添加与删除tr行实例代码
2016/10/18 Javascript
Vue实现自定义下拉菜单功能
2018/07/16 Javascript
手把手带你封装一个vue component第三方库
2019/02/14 Javascript
微信小程序上传图片到php服务器的方法
2019/05/23 Javascript
layui checkbox默认选中,获取选中值,清空所有选中项的例子
2019/09/02 Javascript
JS变量提升原理与用法实例浅析
2020/05/22 Javascript
[01:30:55]VG vs Mineski Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
[43:18]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
python检测lvs real server状态
2014/01/22 Python
Python实现抓取城市的PM2.5浓度和排名
2015/03/19 Python
使用简单工厂模式来进行Python的设计模式编程
2016/03/01 Python
Python MySQL数据库连接池组件pymysqlpool详解
2017/07/07 Python
Python模块WSGI使用详解
2018/02/02 Python
单利模式及python实现方式详解
2018/03/20 Python
Python3随机漫步生成数据并绘制
2018/08/27 Python
python各层级目录下import方法代码实例
2020/01/20 Python
Python底层封装实现方法详解
2020/01/22 Python
Python使用plt.boxplot() 参数绘制箱线图
2020/06/04 Python
Python Selenium实现无可视化界面过程解析
2020/08/25 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
CSS3效果:自定义“W”形运行轨迹实例
2017/03/29 HTML / CSS
Skyscanner英国:苏格兰的全球三大领先航班搜索服务之一
2017/11/09 全球购物
幼儿如何来做好自我评价
2013/11/05 职场文书
宣传工作经验材料
2014/06/02 职场文书
会计专业求职信
2014/08/10 职场文书
党旗在我心中演讲稿
2014/09/15 职场文书
合作意向协议书
2015/01/29 职场文书