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 相关文章推荐
Firefox 无法获取cssRules 的解决办法
Oct 11 Javascript
JavaScript 未结束的字符串常量常见解决方法
Jan 24 Javascript
js调用后台、后台调用前台等方法总结
Apr 17 Javascript
jQuery遮罩层实现方法实例详解(附遮罩层插件)
Dec 08 Javascript
JavaScript中的各种操作符使用总结
May 26 Javascript
判断输入的字符串是否是日期格式的简单方法
Jul 11 Javascript
AngularJS Ajax详解及示例代码
Aug 17 Javascript
javascript宿主对象之window.navigator详解
Sep 07 Javascript
Vue项目History模式404问题解决方法
Oct 31 Javascript
微信小程序实现多选框全选与取消全选功能示例
May 14 Javascript
让你30分钟快速掌握vue3教程
Oct 26 Javascript
Vue+Spring Boot简单用户登录(附Demo)
Nov 12 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实现多级树型菜单
2006/10/09 PHP
JpGraph php柱状图使用介绍
2011/08/23 PHP
php获取文件内容最后一行示例
2014/01/09 PHP
php匹配字符中链接地址的方法
2014/12/22 PHP
smarty内置函数capture用法分析
2015/01/22 PHP
Opcache导致php-fpm崩溃nginx返回502
2015/03/02 PHP
php实现简单的MVC框架实例
2015/09/23 PHP
完美解决在ThinkPHP控制器中命名空间的问题
2017/05/05 PHP
Javascript 面向对象 继承
2010/05/13 Javascript
基于jquery的direction图片渐变动画效果
2010/05/24 Javascript
利用jQuery插件扩展识别浏览器内核与外壳的类型和版本的实现代码
2011/10/22 Javascript
你必须知道的JavaScript 变量命名规则详解
2013/05/07 Javascript
JQuery文字列表向上滚动的代码
2013/11/13 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
2014/06/24 Javascript
JS+DIV+CSS实现仿表单下拉列表效果
2015/08/18 Javascript
jQuery实现智能判断固定导航条或侧边栏的方法
2016/09/04 Javascript
BootStrap学习笔记之nav导航栏和面包屑导航
2017/01/03 Javascript
从零学习node.js之模块规范(一)
2017/02/21 Javascript
jQuery源码解读之extend()与工具方法、实例方法详解
2017/03/30 jQuery
vue-cli脚手架-bulid下的配置文件
2018/03/27 Javascript
详解给Vue2路由导航钩子和axios拦截器做个封装
2018/04/10 Javascript
解决python字典对值(值为列表)赋值出现重复的问题
2019/01/20 Python
Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解
2020/03/30 Python
python3通过qq邮箱发送邮件以及附件
2020/05/20 Python
calendar在python3时间中常用函数举例详解
2020/11/18 Python
python 实现有道翻译功能
2021/02/26 Python
HTML5之语义标签介绍
2016/07/07 HTML / CSS
Under Armour安德玛法国官网:美国高端运动科技品牌
2018/06/29 全球购物
项目经理任命书内容
2014/06/06 职场文书
2014年全国爱牙日宣传活动方案
2014/09/21 职场文书
2014学校领导四风问题对照检查材料思想汇报
2014/09/22 职场文书
工商局局长个人对照检查材料思想汇报
2014/09/23 职场文书
教务处教学工作总结
2015/08/10 职场文书
2016年教师政治思想表现评语
2015/12/02 职场文书
2016年“5.12”国际护士节活动总结
2016/04/06 职场文书
Laravel中获取IP的真实地理位置
2021/04/01 PHP