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 相关文章推荐
List Installed Software Features
Jun 11 Javascript
JQuery 弹出框定位实现方法
Dec 02 Javascript
一个关于jqGrid使用的小例子(行按钮)
Nov 04 Javascript
Javascript实现简单二级下拉菜单实例
Jun 15 Javascript
javascript 动态创建表格的2种方法总结
Mar 04 Javascript
JS组件Bootstrap dropdown组件扩展hover事件
Apr 17 Javascript
HTML5+jQuery实现搜索智能匹配功能
Mar 24 jQuery
Swiper实现轮播图效果
Jul 03 Javascript
Angular实现的内置过滤器orderBy排序与模糊查询功能示例
Dec 29 Javascript
Javascript数组方法reduce的妙用之处分享
Jun 10 Javascript
基于Vue中的父子传值问题解决
Jul 27 Javascript
Vue实现导入Excel功能步骤详解
Jul 03 Vue.js
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
收音机怀古---春雷3P7图片欣赏
2021/03/02 无线电
php中ob函数缓冲机制深入理解
2015/08/03 PHP
CSS+Jquery实现页面圆角框方法大全
2009/12/24 Javascript
javascript学习笔记(九)javascript中的原型(prototype)及原型链的继承方式
2011/04/12 Javascript
javascript中万恶的function实例分析
2011/05/25 Javascript
js下拉框二级关联菜单效果代码具体实现
2013/08/03 Javascript
JS常用正则表达式总结
2013/11/12 Javascript
JS实现一个按钮的方法
2015/02/05 Javascript
js控制li的隐藏和显示实例代码
2016/10/15 Javascript
浅析如何利用angular结合translate为项目实现国际化
2016/12/08 Javascript
JS实现在文本指定位置插入内容的简单示例
2017/12/22 Javascript
vue组件数据传递、父子组件数据获取,slot,router路由功能示例
2019/03/19 Javascript
Node.js API详解之 util模块用法实例分析
2020/05/09 Javascript
python实现汉诺塔递归算法经典案例
2021/03/01 Python
python实现机器人行走效果
2018/01/29 Python
Python 实现12306登录功能实例代码
2018/02/09 Python
DataFrame 将某列数据转为数组的方法
2018/04/13 Python
Python实现模拟登录网易邮箱的方法示例
2018/07/05 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
2019/06/21 Python
python网络编程之多线程同时接受和发送
2019/09/03 Python
python ffmpeg任意提取视频帧的方法
2020/02/21 Python
如何用python处理excel表格
2020/06/09 Python
Python 绘制可视化折线图
2020/07/22 Python
英国最大的化装舞会服装网站:Fancydress.com
2017/08/15 全球购物
英国在线自行车店:Merlin Cycles
2018/08/20 全球购物
澳大利亚在线批发商:Simply Wholesale
2021/02/24 全球购物
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
草船借箭教学反思
2014/02/03 职场文书
铲车司机岗位职责
2014/03/15 职场文书
建议书的格式
2014/05/12 职场文书
2014新生大学四年计划书
2014/09/21 职场文书
人事局接收函
2015/01/30 职场文书
茶花女读书笔记
2015/06/29 职场文书
2016年五一促销广告语
2016/01/28 职场文书
用Python的绘图库(matplotlib)绘制小波能量谱
2021/04/17 Python
PHP实现rar解压读取扩展包小结
2021/06/03 PHP