Vue中的scoped实现原理及穿透方法


Posted in Javascript onMay 15, 2018

何为scoped?

在vue文件中的style标签上,有一个特殊的属性:scoped。当一个style标签拥有scoped属性时,它的CSS样式就只能作用于当前的组件,也就是说,该样式只能适用于当前组件元素。通过该属性,可以使得组件之间的样式不互相污染。如果一个项目中的所有style标签全部加上了scoped,相当于实现了样式的模块化。

scoped的实现原理

vue中的scoped属性的效果主要通过PostCSS转译实现,如下是转译前的vue代码:

<style scoped>
.example {
 color: red;
}
</style>
<template>
 <div class="example">hi</div>
</template>

转译后:

<style>
.example[data-v-5558831a] {
 color: red;
}
</style>
<template>
 <div class="example" data-v-5558831a>hi</div>
</template>

即:PostCSS给一个组件中的所有dom添加了一个独一无二的动态属性,然后,给CSS选择器额外添加一个对应的属性选择器来选择该组件中dom,这种做法使得样式只作用于含有该属性的dom——组件内部dom。

为什么需要穿透scoped?

scoped看起来很美,但是,在很多项目中,会出现这么一种情况,即:引用了第三方组件,需要在组件中局部修改第三方组件的样式,而又不想去除scoped属性造成组件之间的样式污染。此时只能通过特殊的方式,穿透scoped。

<style scoped>
 外层 >>> 第三方组件 {
  样式
 }
</style>

通过 >>> 可以使得在使用scoped属性的情况下,穿透scoped,修改其他组件的值。

曲线救国的方法

其实,还拥有一种曲线救国的方法,即在定义一个含有scoped属性的style标签之外,再定义一个不含有scoped属性的style标签,即在一个vue组件中定义一个全局的style标签,一个含有作用域的style标签:

<style>
/* global styles */
</style>

<style scoped>
/* local styles */
</style>

此时,你只需要将修改第三方样式的css写在第一个style中即可。

个人推荐的方法

以上两种方法,穿透方法实际上违反了scoped属性的意义,曲线救国的方法又使得代码太过于难看。

个人推荐第三种方法,即:由于scoped看起来很美好,但是含有很多的坑,所以,不推荐不使用scoped属性,而通过在外层dom上添加唯一的class来区分不同组件。这种方法既实现了类似于scoped的效果,又方便修改各种第三方组件的样式,代码看起来也相对舒适。

总结

以上所述是小编给大家介绍的Vue中的scoped实现原理及穿透方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript调用Activex控件的事件的实现方法
Apr 11 Javascript
JavaScript游戏之优化篇
Nov 08 Javascript
javascript控制swfObject应用介绍
Nov 29 Javascript
jQuery点击弹出下拉菜单的小例子
Aug 01 Javascript
javascript动态向网页中添加表格实现代码
Feb 19 Javascript
js实现iGoogleDivDrag模块拖动层拖动特效的方法
Mar 04 Javascript
jQuery实现跨域iframe接口方法调用
Mar 14 Javascript
详解JavaScript的变量和数据类型
Nov 27 Javascript
分享我的jquery实现下拉菜单心的
Nov 29 Javascript
jQuery给div,Span, a ,button, radio 赋值与取值
Jun 24 Javascript
Angular.js组件之input mask对input输入进行格式化详解
Jul 10 Javascript
深入理解 ES6中的 Reflect用法
Jul 18 Javascript
vue-cli项目中使用Mockjs详解
May 14 #Javascript
vue使用自定义icon图标的方法
May 14 #Javascript
基于Vue2x的图片预览插件的示例代码
May 14 #Javascript
vue组件中的数据传递方法
May 14 #Javascript
vue如何在自定义组件中使用v-model
May 14 #Javascript
JavaScript常用数学函数用法示例
May 14 #Javascript
JavaScript中常见内置函数用法示例
May 14 #Javascript
You might like
随时给自己贴的图片加文字的php水印
2007/03/16 PHP
彻底杜绝PHP的session cookie错误
2009/08/09 PHP
简单的移动设备检测PHP脚本代码
2011/02/19 PHP
php在文件指定行中写入代码的方法
2012/05/23 PHP
PHP发送AT指令实例代码
2016/05/26 PHP
又一个图片自动缩小的JS代码
2007/03/10 Javascript
MooBox 基于Mootools的对话框插件
2012/01/20 Javascript
js动态添加onclick事件可传参数与不传参数
2014/07/29 Javascript
JavaScript判断undefined类型的正确方法
2015/06/30 Javascript
jquery的幻灯片图片切换效果代码分享
2015/09/07 Javascript
深入理解JavaScript中Ajax
2016/08/02 Javascript
浅谈js中的三种继承方式及其优缺点
2016/08/10 Javascript
AngularJS  ng-table插件设置排序
2016/09/21 Javascript
JS判断指定dom元素是否在屏幕内的方法实例
2017/01/23 Javascript
js实现二级导航功能
2017/03/03 Javascript
jQuery插件FusionCharts绘制的2D双面积图效果示例【附demo源码】
2017/04/11 jQuery
React Native中Navigator的使用方法示例
2017/10/13 Javascript
JS实现定时任务每隔N秒请求后台setInterval定时和ajax请求问题
2017/10/15 Javascript
vue中使用localstorage来存储页面信息
2017/11/04 Javascript
bootstrap 通过加减按钮实现输入框组功能
2017/11/15 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
2019/01/21 Javascript
小程序scroll-view安卓机隐藏横向滚动条的实现详解
2019/05/16 Javascript
jQuery操作选中select下拉框的值代码实例
2020/02/07 jQuery
Python虚拟环境Virtualenv使用教程
2015/05/18 Python
Python异常处理操作实例详解
2018/05/10 Python
Python GUI编程完整示例
2019/04/04 Python
Python 实现将大图切片成小图,将小图组合成大图的例子
2020/03/14 Python
泰国排名第一的家居用品中心:HomePro
2020/11/18 全球购物
枚举和一组预处理的#define有什么不同
2016/09/21 面试题
师范教师大学生职业生涯规划范文
2014/01/05 职场文书
社区文化建设方案
2014/05/02 职场文书
小学生自我评价100字(15篇)
2014/09/18 职场文书
区长工作作风个人整改措施
2014/10/01 职场文书
复兴之路纪录片观后感
2015/06/02 职场文书
门面租赁合同范文
2019/08/06 职场文书
Win10此设备不支持接收Miracast无法投影的解决方法
2022/07/07 数码科技