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 12 Javascript
读jQuery之十一 添加事件核心方法
Jul 31 Javascript
判断一个变量是数组Array类型的方法
Sep 16 Javascript
从零学JSON之JSON数据结构
May 19 Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
Jan 31 Javascript
Bootstrap轮播插件简单使用方法介绍
Jun 21 Javascript
AngularJS基础 ng-href 指令用法
Aug 01 Javascript
微信小程序 页面跳转传参详解
Oct 28 Javascript
vue实现列表的添加点击
Dec 29 Javascript
详解vue组件化开发-vuex状态管理库
Apr 10 Javascript
vue.js轮播图组件使用方法详解
Jul 03 Javascript
图片文字识别(OCR)插件Ocrad.js教程
Nov 26 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中serialize序列化与json性能测试的示例分析
2013/04/27 PHP
codeigniter数据库操作函数汇总
2014/06/12 PHP
PHP实现的多文件上传类及用法示例
2016/05/06 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
2016/09/11 PHP
JS遮罩层效果 兼容ie firefox jQuery遮罩层
2010/07/26 Javascript
javascript 内存回收机制理解
2011/01/17 Javascript
jQuery循环滚动新闻列表示例代码
2014/06/17 Javascript
jquery中页面Ajax方法$.load的功能使用介绍
2014/10/20 Javascript
AngularJS实现元素显示和隐藏的几个案例
2015/12/09 Javascript
Angularjs---项目搭建图文教程
2016/07/08 Javascript
JavaScript中子对象访问父对象的方式详解
2016/09/01 Javascript
getElementById().innerHTML与getElementById().value的区别
2016/10/27 Javascript
Vue如何从1.0迁移到2.0
2017/10/19 Javascript
深入理解 webpack 文件打包机制(小结)
2018/01/08 Javascript
vue webpack实用技巧总结
2018/04/24 Javascript
vue+iview 实现可编辑表格的示例代码
2018/10/31 Javascript
微信小程序返回箭头跳转到指定页面实例解析
2019/10/08 Javascript
JavaScript队列结构Queue实现过程解析
2020/03/07 Javascript
用Python的Django框架编写从Google Adsense中获得报表的应用
2015/04/17 Python
详解Python中的strftime()方法的使用
2015/05/22 Python
Python语言实现百度语音识别API的使用实例
2017/12/13 Python
python字典的遍历3种方法详解
2019/08/10 Python
Django对接支付宝实现支付宝充值金币功能示例
2019/12/17 Python
用python 绘制茎叶图和复合饼图
2021/02/26 Python
图解CSS3制作圆环形进度条的实例教程
2016/05/26 HTML / CSS
HTML5自定义元素播放焦点图动画的实现
2019/09/25 HTML / CSS
英国电器零售商:PRC Direct
2018/06/21 全球购物
牧马人澳大利亚官网:Wrangler澳大利亚
2019/10/08 全球购物
外语系毕业生找工作的求职信
2013/11/28 职场文书
大学毕业通用个人的求职信
2013/12/08 职场文书
小松树教学反思
2014/02/11 职场文书
硕士生工作推荐信
2014/03/07 职场文书
2014年学校卫生工作总结
2014/11/20 职场文书
pytorch实现ResNet结构的实例代码
2021/05/17 Python
详解Android中的TimePickerView(时间选择器)的用法
2022/04/30 Java/Android
xhunter1.sys可以删除嘛? win11提示xhunter1.sys驱动不兼容解决办法
2022/09/23 数码科技