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 相关文章推荐
js中的escape及unescape函数的php实现代码
Sep 04 Javascript
Js 中debug方式
Feb 07 Javascript
js获取class的所有元素
Mar 28 Javascript
jQuery网页右侧广告跟随滚动代码分享
Apr 20 Javascript
第四章之BootStrap表单与图片
Apr 25 Javascript
Vue.js手风琴菜单组件开发实例
May 16 Javascript
JavaScript模拟文件拖选框样式v1.0的实例
Aug 04 Javascript
vue2.0 axios跨域并渲染的问题解决方法
Mar 08 Javascript
基于vue.js实现的分页
Mar 13 Javascript
浅谈React的最大亮点之虚拟DOM
May 29 Javascript
使用Node.js在深度学习中做图片预处理的方法
Sep 18 Javascript
微信小程序中插入激励视频广告并获取收益(实例代码)
Dec 06 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使之能同时支持GIF和JPEG
2006/10/09 PHP
mysql5详细安装教程
2007/01/15 PHP
PHP 检查扩展库或函数是否可用的代码
2010/04/06 PHP
PHP 遍历文件实现代码
2011/05/04 PHP
PHP多例模式介绍
2013/06/24 PHP
php将字符串转化成date存入数据库的两种方式
2014/04/28 PHP
PHP实现表单提交时去除斜杠的方法
2016/12/26 PHP
CI(CodeIgniter)框架实现图片上传的方法
2017/03/24 PHP
Prototype源码浅析 String部分(一)之有关indexOf优化
2012/01/15 Javascript
实测jquery data()如何存值
2013/08/18 Javascript
jquery中event对象属性与方法小结
2013/12/18 Javascript
JavaScript中isPrototypeOf函数作用和使用实例
2015/06/01 Javascript
JavaScript中switch语句的用法详解
2015/06/03 Javascript
在javascript中随机数 math random如何生成指定范围数值的随机数
2015/10/21 Javascript
JS 清除字符串数组中,重复元素的实现方法
2016/05/24 Javascript
基于jQuery实现页面搜索功能
2020/03/26 Javascript
整理关于Bootstrap过渡动画的慕课笔记
2017/03/29 Javascript
最后说说Vue2 SSR 的 Cookies 问题
2018/05/25 Javascript
Vue使用NPM方式搭建项目
2018/10/25 Javascript
深入理解Vue keep-alive及实践总结
2019/08/21 Javascript
js将URL网址转为16进制加密与解密函数
2020/03/04 Javascript
JS数组push、unshift、pop、shift方法的实现与使用方法示例
2020/04/29 Javascript
Vue-cli3生成的Vue项目加载Mxgraph方法示例
2020/05/31 Javascript
[02:37]2015国际邀请赛选手档案—LGD.Xiao8
2015/07/28 DOTA
[51:29]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第一场 11.05
2020/11/05 DOTA
python字符串对其居中显示的方法
2015/07/11 Python
python网络编程 使用UDP、TCP协议收发信息详解
2019/08/29 Python
Django如何使用asyncio协程和ThreadPoolExecutor多线程
2020/10/12 Python
使用html2canvas实现浏览器截图的示例代码
2018/01/26 HTML / CSS
Book Depository亚太地区:一家领先的国际图书零售商
2019/05/05 全球购物
集团公司人力资源部岗位职责
2014/01/03 职场文书
农林环境专业求职信
2014/03/13 职场文书
党员干部形式主义个人整改措施
2014/09/17 职场文书
高二学年自我鉴定范文(2篇)
2014/09/26 职场文书
演讲比赛主持词
2015/06/29 职场文书
处理canvas绘制图片模糊问题
2022/05/11 Javascript