详解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 相关文章推荐
js继承的实现代码
Aug 05 Javascript
appendChild() 或 insertBefore()使用与区别介绍
Oct 11 Javascript
在Google 地图上实现做的标记相连接
Jan 05 Javascript
JavaScript实现相册弹窗功能(zepto.js)
Jun 21 Javascript
js生成随机数(指定范围)的实例代码
Jul 10 Javascript
Vue.2.0.5过渡效果使用技巧
Mar 16 Javascript
vue图片加载与显示默认图片实例代码
Mar 16 Javascript
如何选择jQuery版本 1.x? 2.x? 3.x?
Apr 01 jQuery
js Date()日期函数浏览器兼容问题解决方法
Sep 12 Javascript
angular中不同的组件间传值与通信的方法
Nov 04 Javascript
详解vue静态资源打包中的坑与解决方案
Feb 05 Javascript
小程序Scroll-view上拉滚动刷新数据
Jun 21 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动态生成JavaScript代码
2009/03/09 PHP
PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
2011/09/11 PHP
手把手教你打印出PDF(关于fpdf的简单应用)
2013/06/25 PHP
thinkphp的静态缓存用法分析
2014/11/29 PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
2017/10/19 PHP
PHP实现将多个文件压缩成zip格式并下载到本地的方法示例
2018/05/23 PHP
js下获取div中的数据的原理分析
2010/04/07 Javascript
jQuery Ajax提交表单查询获得数据实例代码
2012/09/19 Javascript
通过正则格式化url查询字符串实现代码
2012/12/28 Javascript
node.js集成百度UE编辑器
2015/02/05 Javascript
jQuery easyui刷新当前tabs的方法
2016/09/23 Javascript
微信小程序 点击控件后选中其它反选实例详解
2017/02/21 Javascript
Angular4 中常用的指令入门总结
2017/06/12 Javascript
详解angularJS+Ionic移动端图片上传的解决办法
2017/09/13 Javascript
JavaScript实现的斑马线表格效果【隔行变色】
2017/09/18 Javascript
AngularJS 控制器 controller的详解
2017/10/17 Javascript
JS页面获取 session 值,作用域和闭包学习笔记
2019/10/16 Javascript
创建与框架无关的JavaScript插件
2020/12/01 Javascript
如何封装Vue Element的table表格组件
2021/02/06 Vue.js
[03:36]2015国际邀请赛第二日现场精彩集锦
2015/08/06 DOTA
TensorFlow变量管理详解
2018/03/10 Python
ubuntu安装sublime3并配置python3环境的方法
2018/03/15 Python
python执行CMD指令,并获取返回的方法
2018/12/19 Python
python仿evething的文件搜索器实例代码
2019/05/13 Python
PyCharm如何导入python项目的方法
2020/02/06 Python
耐克美国官网:Nike.com
2016/08/01 全球购物
全球度假村:Club Med
2017/11/27 全球购物
迷你分体式空调:SoGoodToBuy
2018/08/07 全球购物
城市轨道专业个人求职信范文
2013/09/23 职场文书
小学六一儿童节活动方案
2014/08/27 职场文书
2014年团支部年度工作总结
2014/12/24 职场文书
客服专员岗位职责
2015/02/10 职场文书
2015年销售人员工作总结
2015/04/07 职场文书
入党转正申请报告
2015/05/15 职场文书
基于nginx实现上游服务器动态自动上下线无需reload的实现方法
2021/03/31 Servers
java固定大小队列的几种实现方式详解
2021/07/15 Java/Android