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 相关文章推荐
style、 currentStyle、 runtimeStyle区别分析
Aug 01 Javascript
JS 跳转页面延迟2种方法
Mar 29 Javascript
js获取或设置当前窗口url参数的小例子
Oct 14 Javascript
javascript和jquery实现设置和移除文本框默认值效果代码
Jan 13 Javascript
JavaScript 封装一个tab效果源码分享
Sep 15 Javascript
基于javascript实现checkbox复选框实例代码
Jan 28 Javascript
JS利用cookies设置每隔24小时弹出框
Apr 20 Javascript
jQuery remove()过滤被删除的元素(推荐)
Jul 18 jQuery
jQuery图片查看插件Magnify开发详解
Dec 25 jQuery
深入学习TypeScript 、React、 Redux和Ant-Design的最佳实践
Jun 17 Javascript
vue 出现data-v-xxx的原因及解决
Aug 04 Javascript
js实现贪吃蛇游戏(简易版)
Sep 29 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/13 PHP
PHP实现的简单三角形、矩形周长面积计算器分享
2014/11/18 PHP
php输出全球各个时区列表的方法
2015/03/31 PHP
Laravel中的Blade模板引擎示例详解
2017/10/10 PHP
php读取本地json文件的实例
2018/03/07 PHP
TP5框架页面跳转样式操作示例
2020/04/05 PHP
JQuery浮动DIV提示信息并自动隐藏的代码
2010/08/29 Javascript
jQuery ajax dataType值为text json探索分享
2013/09/23 Javascript
ie浏览器使用js导出网页到excel并打印
2014/03/11 Javascript
基于jquery的文字向上跑动类似跑马灯的效果
2014/09/22 Javascript
Javascript实现获取及设置光标位置的方法
2015/07/21 Javascript
JS中如何实现复选框全选功能
2016/12/19 Javascript
简单明了区分escape、encodeURI和encodeURIComponent
2018/05/26 Javascript
vue项目使用axios发送请求让ajax请求头部携带cookie的方法
2018/09/26 Javascript
element-ui点击查看大图的方法示例
2020/12/14 Javascript
提升Python程序运行效率的6个方法
2015/03/31 Python
python数据类型_元组、字典常用操作方法(介绍)
2017/05/30 Python
DataFrame中去除指定列为空的行方法
2018/04/08 Python
python获取微信企业号打卡数据并生成windows计划任务
2019/04/30 Python
在Python中COM口的调用方法
2019/07/03 Python
python plotly绘制直方图实例详解
2019/07/22 Python
利用rest framework搭建Django API过程解析
2019/08/31 Python
使用python脚本自动创建pip.ini配置文件代码实例
2019/09/20 Python
Keras实现支持masking的Flatten层代码
2020/06/16 Python
Python Socket多线程并发原理及实现
2020/12/11 Python
Python 实现进度条的六种方式
2021/01/06 Python
泰坦健身器材:Titan Fitness
2018/02/13 全球购物
标签和贴纸印刷:Lightning Labels
2018/03/22 全球购物
美国潜水装备、水肺潜水和浮潜设备商店:Leisure Pro
2018/08/08 全球购物
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
亲子阅读的活动方案
2014/08/15 职场文书
2014年党的群众路线教育实践活动整改措施(个人版)
2014/09/25 职场文书
医院见习报告范文
2014/11/03 职场文书
离职报告范文
2014/11/04 职场文书
2014年公司工作总结
2014/11/22 职场文书
《揠苗助长》教学反思
2016/02/20 职场文书