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 14 Javascript
使用Json比用string返回数据更友好,也更面向对象一些
Sep 13 Javascript
js中匿名函数的创建与调用方法分析
Dec 19 Javascript
jQuery中:gt选择器用法实例
Dec 29 Javascript
JQuery实现Ajax加载图片的方法
Dec 24 Javascript
详解用node-images 打造简易图片服务器
May 08 Javascript
详解JS数据类型的值拷贝函数(深拷贝)
Jul 13 Javascript
用最简单的方法判断JavaScript中this的指向(推荐)
Sep 04 Javascript
Angular.js通过自定义指令directive实现滑块滑动效果
Oct 13 Javascript
深入理解JavaScript 中的匿名函数((function() {})();)与变量的作用域
Aug 28 Javascript
微信小程序地图实现展示线路
Jul 29 Javascript
解决vue bus.$emit触发第一次$on监听不到问题
Jul 28 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 不错的学习资料
2009/02/06 PHP
Notice: Trying to get property of non-object problem(PHP)解决办法
2012/03/11 PHP
PHP采用get获取url汉字出现乱码的解决方法
2014/11/13 PHP
php文件上传简单实现方法
2015/01/24 PHP
yii2的restful api路由实例详解
2019/05/14 PHP
Laravel解决nesting level错误和隐藏index.php的问题
2019/10/12 PHP
JS 拼图游戏 面向对象,注释完整。
2009/06/18 Javascript
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
Underscore.js 1.3.3 中文注释翻译说明
2015/06/25 Javascript
详解Bootstrap glyphicons字体图标
2016/01/04 Javascript
javascript执行环境及作用域详解
2016/05/05 Javascript
xtemplate node.js 的使用方法实例解析
2016/08/22 Javascript
ie下js不执行的几种可能
2017/02/28 Javascript
使用JSON格式提交数据到服务端的实例代码
2018/04/01 Javascript
JS实现全屏预览F11功能的示例代码
2018/07/23 Javascript
javascript数组元素删除方法delete和splice解析
2019/12/09 Javascript
浅谈TypeScript的类型保护机制
2020/02/23 Javascript
js 使用ajax设置和获取自定义header信息的方法小结
2020/03/12 Javascript
JavaScript实现原型封装轮播图
2020/12/27 Javascript
python中的对象拷贝示例 python引用传递
2014/01/23 Python
Python自动化测试ConfigParser模块读写配置文件
2016/08/15 Python
python常用知识梳理(必看篇)
2017/03/23 Python
python selenium 弹出框处理的实现
2019/02/26 Python
详解python中index()、find()方法
2019/08/29 Python
Pycharm及python安装详细教程(图解)
2020/07/31 Python
python爬虫智能翻页批量下载文件的实例详解
2021/02/02 Python
pycharm 实现光标快速移动到括号外或行尾的操作
2021/02/05 Python
CSS3教程(3):border-color网页边框色彩
2009/04/02 HTML / CSS
详解HTML5.2版本带来的修改
2020/05/06 HTML / CSS
德国滑雪和户外用品网上商店:XSPO
2019/10/30 全球购物
双十佳事迹材料
2014/01/29 职场文书
2016大学生求职自荐信范文
2016/01/28 职场文书
浅谈Python 中的复数问题
2021/05/19 Python
Node.js实现断点续传
2021/06/23 Javascript
SpringMVC 整合SSM框架详解
2021/08/30 Java/Android
sql注入报错之注入原理实例解析
2022/06/10 MySQL