当前位置:首页 > 日记 > 正文

Vue 组件间的样式冲突污染

Vue 组件间的样式冲突污染

一、污染是如何产生的?

得益于 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 不应该有任何背景颜色,可是现实总在狠狠的打脸~~

不知道你的媚眼看到问题的所在了没:

子元素的 根元素 会继承父元素的 ScopeId!

子元素的 根元素 会继承父元素的 ScopeId!

子元素的 根元素 会继承父元素的 ScopeId!(说了三遍的话,肯定很重要)

由于子元素的 根元素 除了拥有自己的 ScopeId 属性,还继承了父元素的 ScopeId 属性,所以父元素的样式类 bg 对其依然有效

四、怎么破?

破解的方式也很简单,为每一个组件的根元素提供一个另类一点的样式名(如果有的话),例如就不要每个组件都命名为:wrap,根据业务名为:b1-wrap、b2-wrap 等

组件中的非根元素,类名不管怎么命名,怎么重名,都是不会发生污染的,这个自己领悟~~

五、这应当属于 Vue-loader 的一个 bug

没错,这应该是一个 bug,如果是我应该会怎么解呢,编译的时候不是增加属性,而是直接根据 scopeId 修改类名,嘿嘿~~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

相关文章

利用Node.js编写跨平台的spawn语句

利用Node.js编写跨平台的spawn语句

语句,跨平台,详解,电脑软件,Node,前言Node.js 是跨平台的,也就是说它能运行在 Windows、OSX 和 Linux 平台上。很多 Node.js 开发者都是在 OSX 上做开发的,然后再将代码部署到 Linux 服务器上。由于 OSX 和 Linux 都是基于 Unix 的,因此两者共…

Bootstrap滚动监听组件scrollspy.j

Bootstrap滚动监听组件scrollspy.j

组件,使用方法,详解,电脑软件,Bootstrap,其实滚动监听使用的情况还是很多的,比如导航居于右侧,当主题内容滚动某一块的时候,右侧导航对应的要高亮。实现功能1、当滚动区域内设置的hashkey距离顶点到有效位置时,就关联设置其导航上的指定项2、导…

PS鼠绘一把超逼真的金属质感弯刀

PS鼠绘一把超逼真的金属质感弯刀

弯刀,质感,超逼真,电脑软件,PS,这篇教程教的PS鼠绘学习者们使用PS鼠绘超强质感弯刀,教程主要介绍的使用PS来体现弯刀的金属质感和锋利。对于学习鼠绘的朋友来说还是挺有用的,推荐过来和的朋友们一起分享,一起学习了,我们先来看看最终的效果图:下…

创建一般js对象的几种方式

创建一般js对象的几种方式

对象,几种,方式,电脑软件,js,1.对象字面量创建对象var obj = { a:1,b:2 };注意:对象字面量是一个表达式,这种表达式每次运算都会创建并初始化一个新对象,并计算这个新对象的每个属性值。所以如果在循环体内使用对象字面量,每次循环时都会创建新…

ai怎么绘制多重线条?

ai怎么绘制多重线条?

绘制,多重,线条,电脑软件,ai,AI线条的变化可以绘制出很多的图形,下面我们就来看看简单的例子。软件名称:Adobe Illustrator CS6 (AI cs6) 精简绿色中文版(32位+64位)软件大小:205MB更新时间:2014-05-111、新建一个图层2、选矩形工具画矩形设置…

excel表格怎么设置页数excel表格设

excel表格怎么设置页数excel表格设

设置,步骤,方法,页数,表格,  Excel表格中怎么设置页数,其实这很简单只要你跟着着小编的的步骤来学习,很快学会的。excel表格设置页数的步骤首先点开EXCEL表格,比如说你要写六页纸,就用鼠标圈出六个工作表。然后点击开始,开始里面有框线设置,比…

javascript算法之二叉搜索树的示例

javascript算法之二叉搜索树的示例

算法,示例代码,二叉搜索树,电脑软件,javascript,什么是二叉树二叉树就是树的每个节点最多只能有两个子节点什么是二叉搜索树二叉搜索树在二叉树的基础上,多了一个条件,就是二叉树在插入值时,若插入值比当前节点小,就插入到左节点,否则插入到右节…

NodeJS设计模式总结【单例模式,适

NodeJS设计模式总结【单例模式,适

设计模式,单例模式,装饰模式,适配器模式,观察者模式,本文实例讲述了NodeJS设计模式。分享给大家供大家参考,具体如下:1 . 单例模式顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直接返回,若不存在,则创建实…

WPS文字怎么删除表格后空白页

WPS文字怎么删除表格后空白页

删除表,文字,格后,方法,空白页,  表格后的空白页删不掉让人烦恼,那么表格后的空白页该怎样去掉呢?以下是小编给大家整理的WPS文字去掉表格后空白页的技巧,希望能帮到你!WPS文字删除表格后空白页的方法难道就真的没有办法去掉这可恶的空白页…

Spring AOP的实现原理详解及实例

Spring AOP的实现原理详解及实例

实现原理,详解,实例,电脑软件,Spring,Spring AOP的实现原理详解及实例spring 实现AOP是依赖JDK动态代理和CGLIB代理实现的。以下是JDK动态代理和CGLIB代理简单介绍 JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期间创建一…

angular2+node.js express打包部署

angular2+node.js express打包部署

实战,电脑软件,node,express,js,Angular2我自己还在摸索学习中,本文介绍了angular2+node.js express打包部署的实战,分享给大家,也给自己留个笔记angular是客户端js,Node.js 是服务端JS,建立SPA 网站需要把这两者统一到一起。1、angular2项目…

怎么样用word绘制表格用word绘制表

怎么样用word绘制表格用word绘制表

绘制,步骤,方法,表格,电脑软件,  word已经普及人们的生活,可以用word来制作个人简历、制作1篇文章、制作1张电子小报亦或是论文等等,下面小编来教大家如何用word绘制1张简单的表格。word绘制表格的步骤这是我绘制的1张简单表格大家只要知道…

,在大多数情况下,我们希望组件间定义的样式是相互隔离的,在 Weex 当中的确如此,组件天生隔离,可是在 Vue 当中,运行的载体还是浏览器,所有的样式类还是会通过 style", "pubDate": "2023-11-14 05:46:26" }