详解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 相关文章推荐
点图片上一页下一页翻页效果
Jul 09 Javascript
Mootools 1.2教程 输入过滤第二部分(字符串)
Sep 15 Javascript
通过XMLHttpRequest和jQuery实现ajax的几种方式
Aug 28 Javascript
浅析2种JavaScript继承方式
Dec 04 Javascript
jquery及js实现动态加载js文件的方法
Jan 21 Javascript
jQuery插件FusionCharts绘制2D柱状图和折线图的组合图效果示例【附demo源码】
Apr 10 jQuery
使用Bootrap和Vue实现仿百度搜索功能
Oct 26 Javascript
浅谈微信JS-SDK 微信分享接口开发(介绍版)
Aug 15 Javascript
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
Sep 14 Javascript
layui--js控制switch的切换方法
Sep 03 Javascript
微信小程序实现简单文字跑马灯
May 26 Javascript
Node.JS如何实现JWT原理
Sep 18 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使用百度天气接口示例
2014/04/22 PHP
使用PHP+AJAX让WordPress动态加载文章的教程
2015/12/11 PHP
PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)
2016/12/02 PHP
Zend Framework过滤器Zend_Filter用法详解
2016/12/09 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
PHP7修改的函数
2021/03/09 PHP
jquery 获取json数据实现代码
2009/04/27 Javascript
javascript 快速排序函数代码
2012/05/30 Javascript
Ajax执行顺序流程及回调问题分析
2012/12/10 Javascript
关于JavaScript命名空间的一些心得
2014/06/07 Javascript
a标签click和href执行顺序探讨
2014/06/23 Javascript
JS实现控制表格单元格垂直对齐的方法
2015/03/30 Javascript
详解js中常规日期格式处理、月历渲染和倒计时函数
2016/12/28 Javascript
JQuery获取鼠标进入和离开容器的方向
2016/12/29 Javascript
JavaScript验证知识整理
2017/03/24 Javascript
jQuery源码解读之extend()与工具方法、实例方法详解
2017/03/30 jQuery
javascript实现Emrips反质数枚举的示例代码
2017/12/06 Javascript
kafka调试中遇到Connection to node -1 could not be established. Broker may not be available.
2019/09/17 Javascript
[04:54]DOTA2 2017国际邀请赛:上届冠军WINGS采访短片
2017/08/09 DOTA
Python的组合模式与责任链模式编程示例
2016/02/02 Python
python实现京东秒杀功能
2018/07/30 Python
python中matplotlib条件背景颜色的实现
2019/09/02 Python
荷兰和比利时时尚鞋店:Van Dalen
2018/04/23 全球购物
新西兰领先的内衣店:Bendon Lingerie新西兰
2018/07/11 全球购物
印尼综合在线预订网站:Tiket.com(机票、酒店、火车、租车和娱乐)
2018/10/11 全球购物
欧洲领先的技术商店:eibmarkt.com
2019/05/10 全球购物
介绍一下EJB的体系结构
2012/08/01 面试题
教师求职信范文分享
2013/12/27 职场文书
国际贸易个人求职信范文
2014/01/04 职场文书
秋季运动会通讯稿
2014/01/24 职场文书
应届生求职自荐信范文
2014/04/07 职场文书
2014年化工厂工作总结
2014/11/25 职场文书
学校社团活动总结
2015/05/07 职场文书
酒店宣传语大全
2015/07/13 职场文书
2015年十月一日放假通知
2015/08/18 职场文书
如何利用STAR法则制作留学文书?
2019/08/26 职场文书