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 相关文章推荐
js null undefined 空区别说明
Jun 13 Javascript
从零开始学习jQuery (二) 万能的选择器
Oct 01 Javascript
重载toString实现JS HashMap分析
Mar 13 Javascript
通过jquery的$.getJSON做一个跨域ajax请求试验
May 03 Javascript
js插件方式打开pdf文件(浏览器pdf插件分享)
Dec 20 Javascript
js实现透明度渐变效果的方法
Apr 10 Javascript
javascript仿京东导航左侧分类导航下拉菜单效果
Nov 25 Javascript
Bootstrap Table使用整理(五)之分页组合查询
Jun 09 Javascript
微信小程序 动画的简单实例
Oct 12 Javascript
一步步教会你微信小程序的登录鉴权
Apr 09 Javascript
在axios中使用params传参的时候传入数组的方法
Sep 25 Javascript
JavaScript多种滤镜算法实现代码实例
Dec 10 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/12/05 PHP
火车头discuz6.1 完美采集的php接口文件
2009/09/13 PHP
jquery 简单图片导航插件jquery.imgNav.js
2010/03/17 Javascript
ajax java 实现自动完成功能
2012/12/19 Javascript
如何判断鼠标是否在DIV的区域内
2013/11/13 Javascript
使用js实现按钮控制文本框加1减1应用于小时+分钟
2013/12/09 Javascript
JS获取URL中参数值(QueryString)的4种方法分享
2014/04/12 Javascript
特殊情况下如何获取span里面的值
2014/05/20 Javascript
jQuery代码实现对话框右上角菜单带关闭×
2016/05/03 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
2016/11/03 Javascript
微信小程序中form 表单提交和取值实例详解
2017/04/20 Javascript
JavaScript反弹动画效果的实现代码
2017/07/13 Javascript
vue项目总结之文件夹结构配置详解
2017/12/13 Javascript
微信小程序动画(Animation)的实现及执行步骤
2018/10/28 Javascript
vue3.0 搭建项目总结(详细步骤)
2019/05/20 Javascript
使用p5.js实现动态GIF图片临摹重现
2019/10/23 Javascript
python中学习K-Means和图片压缩
2017/11/20 Python
Tensorflow实现卷积神经网络用于人脸关键点识别
2018/03/05 Python
python2.7无法使用pip的解决方法(安装easy_install)
2018/04/03 Python
Python实现账号密码输错三次即锁定功能简单示例
2019/03/29 Python
Python安装与基本数据类型教程详解
2019/05/29 Python
Linux下升级安装python3.8并配置pip及yum的教程
2020/01/02 Python
Python 实现自动获取种子磁力链接方式
2020/01/16 Python
CSS3 实现飘动的云朵动画
2020/12/01 HTML / CSS
JINS眼镜官方网站:日本最大的眼镜邮购
2016/10/14 全球购物
英国顶尖手表珠宝品牌独家授权经销商:HS Johnson
2020/10/28 全球购物
请写出 float x 与"零值"比较的 if 语句
2016/01/04 面试题
运动会100米解说词
2014/01/23 职场文书
2014年采购工作总结
2014/11/20 职场文书
高三语文复习计划
2015/01/19 职场文书
学术研讨会欢迎词
2015/01/26 职场文书
玄武湖导游词
2015/02/05 职场文书
学习经验交流会策划书
2015/11/02 职场文书
礼貌问候语大全
2015/11/10 职场文书
Python中的程序流程控制语句
2022/02/24 Python
ssh服务器拒绝了密码 请再试一次已解决(亲测有效)
2022/08/14 Servers