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中的location用法简单介绍
Mar 07 Javascript
Javascript技巧之不要用for in语句对数组进行遍历
Oct 20 Javascript
jQuery代码优化 选择符篇
Nov 01 Javascript
Prototype源码浅析 String部分(一)之有关indexOf优化
Jan 15 Javascript
JS中的prototype与面向对象的实例讲解
May 22 Javascript
Knockout数组(observable)使用详解示例
Nov 15 Javascript
javascript通过className来获取元素的简单示例代码
Jan 10 Javascript
浅谈JS原型对象和原型链
Mar 02 Javascript
JavaScript中对JSON对象的基本操作示例
May 21 Javascript
VUEJS实战之修复错误并且美化时间(2)
Jun 13 Javascript
Base64(二进制)图片编码解析及在各种浏览器的兼容性处理
Feb 09 Javascript
JavaScript中工厂函数与构造函数示例详解
May 06 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
TMDPHP 模板引擎使用教程
2012/03/13 PHP
PHP APC缓存配置、使用详解
2014/03/06 PHP
php基于session实现数据库交互的类实例
2015/08/03 PHP
学习ExtJS form布局
2009/10/08 Javascript
JS在IE和FireFox之间常用函数的区别小结
2010/03/12 Javascript
五个jQuery图片画廊插件 推荐
2011/05/12 Javascript
node.js 一个简单的页面输出实现代码
2012/03/07 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
2014/03/25 Javascript
什么是cookie?js手动创建和存储cookie
2014/05/27 Javascript
javascript编写实用的省市选择器
2015/02/12 Javascript
readonly和disabled属性的区别
2015/07/26 Javascript
bootstrap——bootstrapTable实现隐藏列的示例
2017/01/14 Javascript
js数组实现权重概率分配
2017/09/12 Javascript
JS模拟实现哈希表及应用详解
2018/05/04 Javascript
脚手架vue-cli工程webpack的基本用法详解
2018/09/29 Javascript
基于node简单实现RSA加解密的方法步骤
2019/03/21 Javascript
Vue项目history模式下微信分享爬坑总结
2019/03/29 Javascript
JQuery特殊效果和链式调用操作示例
2019/05/13 jQuery
为react组件库添加typescript类型提示的方法
2020/06/15 Javascript
Vue实现腾讯云点播视频上传功能的实现代码
2020/08/17 Javascript
微信小程序 接入腾讯地图的两种写法
2021/01/12 Javascript
python统计一个文本中重复行数的方法
2014/11/19 Python
详解Python中expandtabs()方法的使用
2015/05/18 Python
Python中实现三目运算的方法
2015/06/21 Python
浅谈DataFrame和SparkSql取值误区
2018/06/09 Python
Python 解决火狐浏览器不弹出下载框直接下载的问题
2020/03/09 Python
如何基于Python代码实现高精度免费OCR工具
2020/06/18 Python
css 省略号 css3让多余的字符串消失并附加省略号的实现代码
2013/02/07 HTML / CSS
英国婴儿产品专家:Samuel Johnston
2020/04/20 全球购物
师范教师大学生职业生涯规划范文
2014/01/05 职场文书
黄石寨导游词
2015/02/05 职场文书
公司出纳岗位职责
2015/03/31 职场文书
财务出纳岗位职责
2015/03/31 职场文书
2015年大学生村官工作总结
2015/04/21 职场文书
SQL实现LeetCode(177.第N高薪水)
2021/08/04 MySQL
vue+echarts实现多条折线图
2022/03/21 Vue.js