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 相关文章推荐
在chrome浏览器中,防止input[text]和textarea在聚焦时出现黄色边框的解决方法
May 24 Javascript
JavaScript学习笔记记录我的旅程
May 23 Javascript
JavaScript获取当前页面上的指定对象示例代码
Feb 28 Javascript
js分页工具实例
Jan 28 Javascript
使用EVAL处理jqchart jquery 折线图返回数据无效的解决办法
Nov 26 Javascript
jQuery+css实现的换页标签栏效果
Jan 27 Javascript
jQuery获取某天的农历日期并判断是否除夕或新年的方法
Mar 01 Javascript
微信小程序 网络API 上传、下载详解
Nov 09 Javascript
VUE实现日历组件功能
Mar 13 Javascript
Easyui Datagrid自定义按钮列(最后面的操作列)
Jul 13 Javascript
JavaScript闭包的简单应用
Sep 01 Javascript
element ui table(表格)实现点击一行展开功能
Dec 04 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怎样调用MSSQL的存储过程
2006/10/09 PHP
关于PHP结束标签的使用细节探讨及联想
2013/03/04 PHP
php统计文章排行示例
2014/03/04 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十一)
2014/06/25 PHP
php实现无限级分类查询(递归、非递归)
2016/03/10 PHP
CodeIgniter记录错误日志的方法全面总结
2016/05/17 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
jQuery 图像裁剪插件Jcrop的简单使用
2009/05/22 Javascript
JS 自定义带默认值的函数
2011/07/21 Javascript
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
2013/01/04 Javascript
JQuery入门——事件切换之hover()方法应用介绍
2013/02/05 Javascript
验证码在IE中不刷新而谷歌等浏览器正常的解决方案
2014/03/18 Javascript
js实现九宫格图片半透明渐显特效的方法
2015/02/16 Javascript
Javascript实现网络监测的方法
2015/07/31 Javascript
javascript的几种继承方法介绍
2016/03/22 Javascript
JS获取元素多层嵌套思路详解
2016/05/16 Javascript
AngularJS全局scope与Isolate scope通信用法示例
2016/11/22 Javascript
JS根据Unix时间戳显示发布时间是多久前【项目实测】
2019/07/10 Javascript
JS控制只能输入数字并且最多允许小数点两位
2019/11/24 Javascript
Vue+scss白天和夜间模式切换功能的实现方法
2021/01/05 Vue.js
Python实现KNN邻近算法
2021/01/28 Python
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
2018/04/17 Python
对python中类的继承与方法重写介绍
2019/01/20 Python
Django搭建项目实战与避坑细节详解
2020/12/06 Python
详解如何将 Canvas 绘制过程转为视频
2021/01/25 HTML / CSS
Myholidays美国:在线旅游网站
2019/08/16 全球购物
工程测量与监理专业应届生求职信
2013/11/27 职场文书
个人简历中自我评价
2014/02/11 职场文书
大学生求职工作的自我评价
2014/02/13 职场文书
经济管理专业求职信
2014/06/09 职场文书
2014年导购员工作总结
2014/11/18 职场文书
小孩不笨观后感
2015/06/03 职场文书
签证工作证明模板
2015/06/15 职场文书
2015年社区党建工作汇报材料
2015/06/25 职场文书
原生JS实现飞机大战小游戏
2021/06/09 Javascript
详解Go语言运用广度优先搜索走迷宫
2021/06/23 Python