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 事件队列调整方法
Sep 18 Javascript
浅谈Javascript面向对象编程
Nov 15 Javascript
JavaScript删除数组元素的方法
Mar 20 Javascript
JavaScript实现的简单幂函数实例
Apr 17 Javascript
Bootstrap表单布局样式源代码
Jul 04 Javascript
BootStrap栅格系统、表单样式与按钮样式源码解析
Jan 20 Javascript
vue2笔记 — vue-router路由懒加载的实现
Mar 03 Javascript
jQuery复合事件用法示例
Jun 10 jQuery
Vuejs 页面的区域化与组件封装的实现
Sep 11 Javascript
vue-cli3.0+element-ui上传组件el-upload的使用
Dec 03 Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
Jun 21 Javascript
vue项目创建步骤及路由router
Jan 14 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防盗链的常用方法小结
2010/07/02 PHP
再谈javascript常见错误及解决方法
2016/09/16 Javascript
设置jquery UI 控件的大小方法
2016/12/12 Javascript
JS中LocalStorage与SessionStorage五种循序渐进的使用方法
2017/07/12 Javascript
Vue 兄弟组件通信的方法(不使用Vuex)
2017/10/26 Javascript
jQuery实现动态添加节点与遍历节点功能示例
2017/11/09 jQuery
Vue cli3 库模式搭建组件库并发布到 npm的流程
2018/10/12 Javascript
js中关于Blob对象的介绍与使用
2019/11/29 Javascript
微信小程序indexOf的替换方法(推荐)
2020/01/14 Javascript
[01:35]2018年度CS GO最佳战队-完美盛典
2018/12/17 DOTA
python创建线程示例
2014/05/06 Python
使用Python编写一个最基础的代码解释器的要点解析
2016/07/12 Python
利用Python将文本中的中英文分离方法
2018/10/31 Python
Python简单获取二维数组行列数的方法示例
2018/12/21 Python
python对矩阵进行转置的2种处理方法
2019/07/17 Python
PyCharm2018 安装及破解方法实现步骤
2019/09/09 Python
python匿名函数的使用方法解析
2019/10/10 Python
matplotlib实现显示伪彩色图像及色度条
2019/12/07 Python
Python内置方法实现字符串的秘钥加解密(推荐)
2019/12/09 Python
Python文件操作基础流程解析
2020/03/19 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
PyCharm最新激活码PyCharm2020.2.3有效
2020/11/18 Python
CSS3中引入多种自定义字体font-face
2020/06/12 HTML / CSS
HTML5+CSS3实现机器猫
2016/10/17 HTML / CSS
香港中原电器网上商店:Chung Yuen
2019/06/26 全球购物
美国校服网上商店:French Toast
2019/10/08 全球购物
医院辞职信范文
2014/01/17 职场文书
淘宝好评语大全
2014/05/05 职场文书
给公司的建议书范文
2014/05/13 职场文书
2014年国庆节寄语
2014/09/19 职场文书
个人股份转让协议书范本
2014/10/26 职场文书
幼儿园大班开学寄语(2015秋季)
2015/05/27 职场文书
工作证明格式范文
2015/06/15 职场文书
高效笔记技巧分享:学会这些让你不再困扰
2019/09/04 职场文书
Python激活Anaconda环境变量的详细步骤
2021/06/08 Python
深入理解pytorch库的dockerfile
2022/06/10 Python