详解Vue中的scoped及穿透方法


Posted in Javascript onApril 18, 2019

scoped的由来

css一直有个令人困扰的作用域问题:即使是模块化编程下,在对应的模块的js中import css进来,这个css仍然是全局的。为了避免css样式之间的污染,vue中引入了scoped这个概念。

在vue文件中的style标签上,有一个特殊的属性:scoped。当一个style标签拥有scoped属性时,它的CSS样式就只能作用于当前的组件。通过设置该属性,使得组件之间的样式不互相污染。如果一个项目中的所有style标签全部加上了scoped,相当于实现了样式的模块化。

但是这些样式又是如何实现不相互影响呢?

scoped的原理

vue中的scoped 通过在DOM结构以及css样式上加唯一不重复的标记:data-v-hash的方式,以保证唯一(而这个工作是由过PostCSS转译实现的),达到样式私有化模块化的目的。

总结一下scoped三条渲染规则:

  1. 给HTML的DOM节点加一个不重复data属性(形如:data-v-19fca230)来表示他的唯一性
  2. 在每句css选择器的末尾(编译后的生成的css语句)加一个当前组件的data属性选择器(如[data-v-19fca230])来私有化样式
  3. 如果组件内部包含有其他组件,只会给其他组件的最外层标签加上当前组件的data属性

上个栗子。转译前:

<style lang="scss" scoped>
  .test {
    background: blue;
    span{
      color:red;
    }
  }
</style>
<template>
  <div class="test">
    <span>hello world !</span>
  </div>
</template>

转译后:

<style lang="css">
  .test[data-v-ff86ae42] {
    background: blue;
  }
  .test span[data-v-ff86ae42]{
    color: red;
  }
</style>
<template>
  <div class="test" data-v-ff86ae42>
    <span data-v-ff86ae42>hello world !</span>
  </div>
</template>

可以看出:PostCSS会给一个组件中的所有dom添加了一个独一无二的动态属性data-v-xxxx,然后,给CSS选择器额外添加一个对应的属性选择器来选择该组件中dom,这种做法使得样式只作用于含有该属性的dom——组件内部dom, 从而达到了'样式模块化'的效果.

穿透scoped

但是,在做项目中,会遇到这么一个问题,即:引用了第三方组件,需要在组件中局部修改第三方组件的样式,而又不想去除scoped属性造成组件之间的样式污染。那么有哪些解决办法呢?

  1. 不使用scoped 省略(个人不推荐)
  2. 在模板中使用两次style标签:
<style lang="scss">
  /*添加要覆盖的样式*/
</style>
<style lang="scss" scoped>
  /* local styles */
</style>
<!--vue官网中提到:一个 .vue 文件可以包含多个style标签。所以上面的写法是没有问题的。-->

穿透scoped >>>

<template>
 <div class="box">
  <dialog></dialog>
 </div>
</template>
<!--使用 >>>或者 /deep/ 操作符(Sass 之类的预处理器无法正确解析 >>>,可以使用/deep/)-->
<style lang="scss" scoped>
.box {
 /deep/ input {
  width: 166px;
  text-align: center;
 }
}
</style>
或者
<style lang="scss" scoped>
.box >>> input {
  width: 166px;
  text-align: center;
 }
}
</style>

希望能帮助遇到同样问题的你,thanks!

以上所述是小编给大家介绍的Vue中的scoped及穿透方法详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript 学习笔记一些小技巧
Mar 28 Javascript
JS.getTextContent(element,preformatted)使用介绍
Sep 21 Javascript
jquery提取元素里的纯文本不包含span等里的内容
Sep 30 Javascript
原生js实现的贪吃蛇网页版游戏完整实例
May 18 Javascript
jQuery树形下拉菜单特效代码分享
Aug 15 Javascript
javascript中substring()、substr()、slice()的区别
Aug 30 Javascript
js和jquery实现监听键盘事件示例代码
Jun 24 Javascript
window.onload绑定多个事件的两种解决方案
May 15 Javascript
js操作数据库实现注册和登陆的简单实例
May 26 Javascript
微信小程序之前台循环数据绑定
Aug 18 Javascript
JS+HTML5本地存储Localstorage实现注册登录及验证功能示例
Feb 10 Javascript
JavaScript接口实现方法实例分析
May 16 Javascript
Node.js对MongoDB进行增删改查操作的实例代码
Apr 18 #Javascript
Vue 进阶之路(三)
Apr 18 #Javascript
Vue自定义全局Toast和Loading的实例详解
Apr 18 #Javascript
javascript数据类型中的一些小知识点(推荐)
Apr 18 #Javascript
在element-ui的select下拉框加上滚动加载
Apr 18 #Javascript
11个教程中不常被提及的JavaScript小技巧(推荐)
Apr 17 #Javascript
vue模式history下在iis中配置流程
Apr 17 #Javascript
You might like
PHP XML操作的各种方法解析(比较详细)
2010/06/17 PHP
PHP array_multisort()函数的使用札记
2011/07/03 PHP
php实现字符串首字母大写和单词首字母大写的方法
2015/03/14 PHP
Yii2学习笔记之汉化yii设置表单的描述(属性标签attributeLabels)
2017/02/07 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
用jquery实现等比例缩放图片效果插件
2010/07/24 Javascript
Jquery实现三层遍历删除功能代码
2013/04/23 Javascript
基于JavaScript实现继承机制之调用call()与apply()的方法详解
2013/05/07 Javascript
详解Jquery实现ready和bind事件
2016/04/14 Javascript
jQuery简单设置文本框回车事件的方法
2016/08/01 Javascript
JS中常用的正则表达式
2016/09/29 Javascript
JSON与XML的区别对比及案例应用
2016/11/11 Javascript
angularJS+requireJS实现controller及directive的按需加载示例
2017/02/20 Javascript
利用canvas实现的加载动画效果实例代码
2017/07/05 Javascript
详解vue3.0 diff算法的使用(超详细)
2020/07/01 Javascript
python入门之语句(if语句、while语句、for语句)
2015/01/19 Python
Python实现判断并移除列表指定位置元素的方法
2018/04/13 Python
python实现下载pop3邮件保存到本地
2018/06/19 Python
python实现贪吃蛇小游戏
2020/03/21 Python
简单了解python单例模式的几种写法
2019/07/01 Python
Python寻找路径和查找文件路径的示例
2019/07/10 Python
Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解
2020/02/14 Python
Python 生成VOC格式的标签实例
2020/03/10 Python
利用CSS3实现折角效果实例源码
2016/09/28 HTML / CSS
HTML5对手机页面长按会粘贴复制禁用的解决方法
2016/07/19 HTML / CSS
英国最大最好的无人机商店:Drones Direct
2019/07/12 全球购物
adidas泰国官网:adidas TH
2020/07/11 全球购物
游戏商店:Eneba
2020/04/25 全球购物
司机辞职报告范文
2014/01/20 职场文书
毕业生个人求职自荐信
2014/02/26 职场文书
院领导写的就业推荐信
2014/03/09 职场文书
秋天的怀念教学反思
2014/04/28 职场文书
2015年元旦联欢晚会活动总结
2014/11/28 职场文书
少先队大队委竞选口号
2015/12/25 职场文书
JS数组方法some、every和find的使用详情
2021/10/05 Javascript