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的变量作用域深入理解
Oct 25 Javascript
js控制web打印(局部打印)方法整理
May 29 Javascript
js判断设备是否为PC并调整图片大小
Feb 12 Javascript
jquery实现公告翻滚效果
Feb 27 Javascript
javascript中对变量类型的判断方法
Aug 09 Javascript
学习jQuey中的return false
Dec 18 Javascript
如何使用JS在HTML中自定义字符串格式化
Jul 20 Javascript
Vue Element使用icon图标教程详解(第三方)
Feb 07 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
Jun 19 Javascript
小程序清理本地缓存的方法
Aug 17 Javascript
Bootstrap 实现表格样式、表单布局的实例代码
Dec 09 Javascript
JS开发 富文本编辑器TinyMCE详解
Jul 19 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中的抽象方法和抽象类
2017/02/14 PHP
PHP使用文件锁解决高并发问题示例
2018/03/29 PHP
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
2010/04/01 Javascript
Js 冒泡事件阻止实现代码
2013/01/27 Javascript
jquery的冒泡事件的阻止与允许(三种实现方法)
2013/02/01 Javascript
jQuery+CSS实现菜单滑动伸展收缩(仿淘宝)
2013/03/22 Javascript
js中一个函数获取另一个函数返回值问题探讨
2013/11/21 Javascript
浅析jQuery中调用ajax方法时在不同浏览器中遇到的问题
2014/06/11 Javascript
在JavaScript中访问字符串的子串
2015/07/07 Javascript
提高jQuery性能优化的技巧
2015/08/03 Javascript
win7下安装配置node.js+express开发环境
2015/12/06 Javascript
使用Jasmine和Karma对AngularJS页面程序进行测试
2016/03/05 Javascript
js css实现垂直方向自适应的三角提示菜单
2016/06/26 Javascript
js仿腾讯QQ的web登陆界面
2016/08/19 Javascript
angular2+node.js express打包部署的实战
2017/07/27 Javascript
基于vue2实现上拉加载功能
2017/11/28 Javascript
JavaScript实现数组全排列、去重及求最大值算法示例
2018/07/30 Javascript
如何将HTML字符转换为DOM节点并动态添加到文档中详解
2018/08/19 Javascript
微信小程序实现日历功能
2018/11/27 Javascript
jQuery中实现text()的方法
2019/04/04 jQuery
js实现3D照片墙效果
2019/10/28 Javascript
javascript将扁平的数据转为树形结构的高效率算法
2020/02/27 Javascript
解决ant-design-vue中menu菜单无法默认展开的问题
2020/10/31 Javascript
Python操作sqlite3快速、安全插入数据(防注入)的实例
2014/04/26 Python
Python使用pyautogui模块实现自动化鼠标和键盘操作示例
2018/09/04 Python
windows上安装python3教程以及环境变量配置详解
2019/07/18 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
2020/04/29 Python
Python实现爬取并分析电商评论
2020/06/19 Python
CSS3只让背景图片旋转180度的实现示例
2021/03/09 HTML / CSS
加利福尼亚州威尼斯的女性奢侈品设计师服装和概念店:Mona Moore
2018/09/13 全球购物
介绍一下JNDI的基本概念
2013/07/26 面试题
文艺演出策划方案
2014/06/07 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
2016年社区六一儿童节活动总结
2016/04/06 职场文书
Nginx的反向代理实例详解
2021/03/31 Servers
详解MySQL InnoDB存储引擎的内存管理
2021/04/08 MySQL