源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Vue 组件间的样式冲突污染

  • 时间:2021-06-26 05:44 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Vue 组件间的样式冲突污染
[b]一、污染是如何产生的?[/b] 得益于 Vue-loader,在 Vue 中可以使用类似于 Web Component 的组件化写法, [code]<template></template><style></style><script></script>[/code] ,在大多数情况下,我们希望组件间定义的样式是相互隔离的,在 Weex 当中的确如此,组件天生隔离,可是在 Vue 当中,运行的载体还是浏览器,所有的样式类还是会通过 style 标签插入头部,影响全局,交叉污染 [b]二、增加 Scoped 标识[/b] 依然是 Vue-loader,通过为组件中的 style 标签增加一个 scoped 标识,Vue-loader 在编译的过程中会为组件每一个元素节点增加 scopeId 作为属性,同时为所有的样式类加上属性选择器 scopeId,从而达到隔离的效果,大概是下面的样子: 每个组件有唯一的 scopeId,按理说,这样应该能够做到样式隔离了,实际上, 这种方式其实表现已经足够好了,除了以下这种情况~~ [b]三、ScopeId 的继承[/b] 我们把上面的例子再完善下:
// 父组件
<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 不应该有任何背景颜色,可是现实总在狠狠的打脸~~ [img]http://files.jb51.net/file_images/article/201708/201783192439337.png?201773192538[/img] 不知道你的媚眼看到问题的所在了没: 子元素的 根元素 会继承父元素的 ScopeId! 子元素的 根元素 会继承父元素的 ScopeId! 子元素的 根元素 会继承父元素的 ScopeId!(说了三遍的话,肯定很重要) 由于子元素的 根元素 除了拥有自己的 ScopeId 属性,还继承了父元素的 ScopeId 属性,所以父元素的样式类 bg 对其依然有效 [b]四、怎么破?[/b] 破解的方式也很简单,为每一个组件的根元素提供一个另类一点的样式名(如果有的话),例如就不要每个组件都命名为:wrap,根据业务名为:b1-wrap、b2-wrap 等 组件中的非根元素,类名不管怎么命名,怎么重名,都是不会发生污染的,这个自己领悟~~ [b]五、这应当属于 Vue-loader 的一个 bug[/b] 没错,这应该是一个 bug,如果是我应该会怎么解呢,编译的时候不是增加属性,而是直接根据 scopeId 修改类名,嘿嘿~~ 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程素材网。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部