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 相关文章推荐
jQuery+easyui中的combobox实现下拉框特效
Feb 27 Javascript
JS运动框架之分享侧边栏动画实例
Mar 03 Javascript
jQuery实现彩带延伸效果的网页加载条loading动画
Oct 29 Javascript
Bootstrap嵌入jqGrid,使你的table牛逼起来
May 05 Javascript
jQuery之简单的表单验证实例
Jul 07 Javascript
基于bootstrap的选择框插件icheck
Dec 23 Javascript
Angularjs单选框相关的示例代码
Aug 17 Javascript
利用JS测试目标网站的打开响应速度
Dec 01 Javascript
手动用webpack搭建第一个ReactApp的示例
Apr 11 Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
Aug 24 Javascript
快速解决vue动态绑定多个class的官方实例语法无效的问题
Sep 05 Javascript
Vue使用富文本编辑器Vue-Quill-Editor(含图片自定义上传服务、清除复制粘贴样式等)
May 15 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 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
php下关于中英数字混排的字符串分割问题
2010/04/06 PHP
PHP获取youku视频真实flv文件地址的方法
2014/12/23 PHP
php HTML无刷新提交表单
2016/04/05 PHP
PHPCMS V9 添加二级导航的思路详解
2016/10/20 PHP
Javascript遍历table中的元素示例代码
2014/07/08 Javascript
JS辨别访问浏览器判断是android还是ios系统
2014/08/19 Javascript
Node.js的Express框架使用上手指南
2016/03/12 Javascript
laydate日历控件使用方法详解
2017/11/20 Javascript
javascript填充默认头像方法
2018/02/22 Javascript
vue修改对象的属性值后页面不重新渲染的实例
2018/08/09 Javascript
在小程序Canvas中使用measureText的方法示例
2018/10/19 Javascript
js如何实现元素曝光上报
2019/08/07 Javascript
Python 面向对象 成员的访问约束
2008/12/23 Python
Python中操作符重载用法分析
2016/04/29 Python
python+selenium+autoit实现文件上传功能
2017/08/23 Python
Python OpenCV处理图像之滤镜和图像运算
2018/07/10 Python
python中正则表达式 re.findall 用法
2018/10/23 Python
使用python进行波形及频谱绘制的方法
2019/06/17 Python
程序员的七夕用30行代码让Python化身表白神器
2019/08/07 Python
python 爬虫 实现增量去重和定时爬取实例
2020/02/28 Python
PyQt5 QDockWidget控件应用详解
2020/08/12 Python
Python如何爬取51cto数据并存入MySQL
2020/08/25 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
2021/02/25 Python
使用CSS3的appearance属性改变元素的外观的方法
2015/12/12 HTML / CSS
SAZAC的动物连体衣和动物睡衣:Kigurumi Shop
2020/03/14 全球购物
综合实践活动总结
2014/05/05 职场文书
同学聚会通知短信
2015/04/20 职场文书
民事起诉书范本
2015/05/19 职场文书
家长对学校的意见和建议
2015/06/03 职场文书
python文本处理的方案(结巴分词并去除符号)
2021/05/26 Python
html实现弹窗的实例
2021/06/09 HTML / CSS
利用 JavaScript 构建命令行应用
2021/11/17 Javascript
详解nginx安装过程并代理下载服务器文件
2022/02/12 Servers
Java实战之课程信息管理系统的实现
2022/04/01 Java/Android
Axios代理配置及封装响应拦截处理方式
2022/04/07 Vue.js