vue中的scoped坑点

栏目: CSS · 发布时间: 5年前

内容简介:今天在覆盖iview组件样式的时候发现一个问题,就是无法覆盖组件原有的样式,最后在github的我们假设把这种组件叫做模块私有组件,其他的未加scoped的叫做模块一般组件。通过查看DOM结构发现:vue通过在DOM结构以及css样式上加唯一不重复的标记,以保证唯一,达到样式私有化模块化的目的。代码如下:

今天在覆盖iview组件样式的时候发现一个问题,就是无法覆盖组件原有的样式,最后在github的 issue 中找到了答案: 不要使用 scoped 属性。于是我查找了下关于 scoped 的文章。

我们假设把这种组件叫做模块私有组件,其他的未加scoped的叫做模块一般组件。通过查看DOM结构发现:vue通过在DOM结构以及css样式上加唯一不重复的标记,以保证唯一,达到样式私有化模块化的目的。

代码如下:

//valChange.less(使用了嵌套规则)
#valueSlide{
	.bigSlider .ivu-slider-wrap{
		height: 6px;
	}
	.bigSlider .ivu-slider-bar {
		height: 6px;
	}
	.bigSlider .ivu-slider-button{
		width: 14px;
	    height: 14px;
	} 
}

//html部分
<style lang="less" scoped>
	@import "./valChange.less";
</style>
<div class="valid-panel">
	<div class="containerBox">
		<div id="valueSlide" v-bind:style="validStyle">
			<Slider ></Slider>
		</div>
	</div>
</div>
复制代码

也就是我们在style中使用scoped属性会出现下面的情况: HTML部分:

vue中的scoped坑点

CSS部分:

vue中的scoped坑点

从上面的字可以看出,添加了scoped属性的组件,为了达到组件样式模块化,做了两个处理:

  • 给HTML的DOM节点加一个不重复 data 属性(形如: data-v-19fca230 )来表示他的唯一性
  • 在每句css选择器的末尾(编译后的生成的css语句)加一个当前组件的 data 属性选择器(如 [data-v-2311c06a] )来私有化样式

那么问题来了:对于当前组件下调用的其他组件, data 属性只会添加到第一层HTML中:

vue中的scoped坑点

对于我们想覆盖的样式则无法起到作用:(在浏览器调试中手动添加 [data-v-19fca230] 属性后可以匹配)

vue中的scoped坑点

解决方案:不使用 scoped 属性,更多详细介绍可以参考这篇文章

总结一下 scoped 三条渲染规则:

  • 给HTML的DOM节点加一个不重复data属性(形如: data-v-19fca230 )来表示他的唯一性
  • 在每句css选择器的末尾(编译后的生成的css语句)加一个当前组件的 data 属性选择器(如 [data-v-19fca230] )来私有化样式
  • 如果组件内部包含有其他组件,只会给其他组件的最外层标签加上当前组件的data属性

问题补充:1.如果不使用 scoped 如何解决样式全局污染? 推荐使用 scoped 推动组件私有化,文章所提到的不使用仅出现在已有UI库的样式覆盖上(当然人家用了 scoped 那就很难办了)。 首先,解决 组件样式全局污染 ,也就是我们在这里不使用 scoped 覆盖了样式,那么我们在其他地方调用该组件就会被覆盖。那么我们在使用组件的时候对组件给一个 类名 或者其他甄别属性(id),覆盖样式就针对该类名进行重写样式。 其次,解决 其他样式全局污染 ,如果我们通过:

<style lang="less">
    @import "./test.less";
</style>
复制代码

引进样式,那么不使用 scoped"./test.less" 中的其他类名样式可能会污染全局,我这里用一个比较笨的方法处理:在模板中使用两次 <style></style> 标签:

<style lang="less" scoped>
    @import "./test.less";
</style>
<style lang="less">
	//你的覆盖样式
</style>
复制代码

这样既覆盖了样式,其他样式不会被覆盖到全局,效果代码我就补贴上来,感兴趣的同学可以自己试一试。(注意两个标签的顺序)。

官网vue-loader 中提到每个vue模板中可以有多个 <style></style> 标签,所以上面的写法是没有问题的。


以上所述就是小编给大家介绍的《vue中的scoped坑点》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Practical Django Projects, Second Edition

Practical Django Projects, Second Edition

James Bennett / Apress / 2009 / 44.99

Build a django content management system, blog, and social networking site with James Bennett as he introduces version 1.1 of the popular Django framework. You’ll work through the development of ea......一起来看看 《Practical Django Projects, Second Edition》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换