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 相关文章推荐
jQuery AnythingSlider滑动效果插件
Feb 07 Javascript
js操作select控件的几种方法
Jun 02 Javascript
基于jQuery的message插件实现右下角弹出消息框
Jan 11 Javascript
浅谈JavaScript中Date(日期对象),Math对象
Feb 05 Javascript
jquery实现在网页指定区域显示自定义右键菜单效果
Aug 25 Javascript
整理AngularJS框架使用过程当中的一些性能优化要点
Mar 05 Javascript
JavaScript实现数据类型的相互转换
Mar 06 Javascript
微信小程序实现拖拽 image 触摸事件监听的实例
Aug 17 Javascript
js中Object.defineProperty()方法的不详解
Jul 09 Javascript
Vuex 使用及简单实例(计数器)
Aug 29 Javascript
webpack 静态资源集中输出的方法示例
Nov 09 Javascript
jQuery实现的鼠标拖动浮层功能示例【拖动div等任何标签】
Dec 29 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
浅析Mysql 数据回滚错误的解决方法
2013/08/05 PHP
zen_cart实现支付前生成订单的方法
2016/05/06 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
lib.utf.js
2007/08/21 Javascript
jquery图片轮播插件仿支付宝2013版全屏图片幻灯片
2014/04/03 Javascript
js实现div闪烁原理及实现代码
2014/06/24 Javascript
强大Vue.js组件浅析
2016/09/12 Javascript
Canvas实现动态的雪花效果
2017/02/13 Javascript
Bootstrap栅格系统简单实现代码
2017/03/06 Javascript
js实现canvas保存图片为png格式并下载到本地的方法
2017/08/31 Javascript
在AngularJs中设置请求头信息(headers)的方法及不同方法的比较
2018/09/04 Javascript
使用webpack构建应用的方法步骤
2019/03/04 Javascript
Seajs源码详解分析
2019/04/02 Javascript
详解vue项目中实现图片裁剪功能
2019/06/07 Javascript
vue中的 $slot 获取插槽的节点实例
2019/11/12 Javascript
Vue数字输入框组件使用方法详解
2020/02/10 Javascript
vue中提示$index is not defined错误的解决方式
2020/09/02 Javascript
Handtrack.js库实现实时监测手部运动(推荐)
2021/02/08 Javascript
[48:47]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python实现感知器模型、两层神经网络
2017/12/19 Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
2019/02/22 Python
python使用pip安装SciPy、SymPy、matplotlib教程
2019/11/20 Python
jupyter notebook快速入门及使用详解
2020/11/13 Python
CSS3教程(4):网页边框和网页文字阴影
2009/04/02 HTML / CSS
COSETTE官网:奢华,每天
2020/03/22 全球购物
介绍一下linux文件系统分配策略
2012/11/17 面试题
住院医师规范化培训实施方案
2014/06/12 职场文书
2015年党风廉政承诺书
2015/01/22 职场文书
鸡毛信观后感
2015/06/11 职场文书
2015领导干部廉洁自律工作总结
2015/07/23 职场文书
拔河比赛队名及霸气口号
2015/12/24 职场文书
2016入党积极分子党校培训心得体会
2016/01/06 职场文书
2019新员工心得体会
2019/06/25 职场文书
python 三边测量定位的实现代码
2021/04/22 Python
MySQL 如何分析查询性能
2021/05/12 MySQL
SpringBoot中HttpSessionListener的简单使用方式
2022/03/17 Java/Android