详解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 相关文章推荐
学习YUI.Ext 第六天--关于树TreePanel(Part 2异步获取节点)
Mar 10 Javascript
Js 中debug方式
Feb 07 Javascript
js选取多个或单个元素的实现代码(用class)
Aug 22 Javascript
8个实用的jQuery技巧
Mar 04 Javascript
javascript框架设计读书笔记之种子模块
Dec 02 Javascript
JavaScript对数字的判断与处理实例分析
Feb 02 Javascript
利用JS实现点击按钮后图片自动切换的简单方法
Oct 24 Javascript
原生js验证简洁注册登录页面
Dec 17 Javascript
微信小程序自定义tabBar组件开发详解
Sep 24 Javascript
详解TypeScript+Vue 插件 vue-class-component的使用总结
Feb 18 Javascript
Layui带搜索的下拉框的使用以及动态数据绑定方法
Sep 28 Javascript
详解js中的原型,原型对象,原型链
Jul 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
ubuntu 编译安装php 5.3.3+memcache的方法
2010/08/05 PHP
php自动注册登录验证机制实现代码
2011/12/20 PHP
ThinkPHP3.1新特性之字段合法性检测详解
2014/06/19 PHP
PHP获取数组最大值下标的方法
2015/05/12 PHP
PHP框架性能测试报告
2016/05/08 PHP
浅谈php中的循环while、do...while、for、foreach四种循环
2016/11/05 PHP
PHP基于Redis消息队列实现发布微博的方法
2017/05/03 PHP
老生常谈PHP 文件写入和读取(必看篇)
2017/05/22 PHP
php成功操作redis cluster集群的实例教程
2019/01/13 PHP
解决tp5在nginx下修改配置访问的问题
2019/10/16 PHP
JQuery核心函数是什么及使用方法介绍
2016/05/03 Javascript
总结Javascript中的隐式类型转换
2016/08/24 Javascript
JS函数修改html的元素内容,及修改属性内容的方法
2016/10/28 Javascript
jquery无法为动态生成的元素添加点击事件的解决方法(推荐)
2016/12/26 Javascript
js仿淘宝评价评分功能
2017/02/28 Javascript
Express + Node.js实现登录拦截器的实例代码
2017/07/01 Javascript
使用JS编写的随机抽取号码的小程序
2017/08/11 Javascript
解决vue单页使用keep-alive页面返回不刷新的问题
2018/03/13 Javascript
利用d3.js力导布局绘制资源拓扑图实例教程
2019/01/08 Javascript
浅谈vue限制文本框输入数字的正确姿势
2019/09/02 Javascript
JavaScript遍历数组的方法代码实例
2020/01/14 Javascript
JavaScript组合设计模式--改进引入案例分析
2020/05/23 Javascript
详解Python中的文件操作
2016/08/28 Python
python字典DICT类型合并详解
2017/08/17 Python
Python标准库之itertools库的使用方法
2017/09/07 Python
Python排序搜索基本算法之堆排序实例详解
2017/12/08 Python
python GUI实现小球满屏乱跑效果
2019/05/09 Python
计算机二级python学习教程(1) 教大家如何学习python
2019/05/16 Python
python小程序实现刷票功能详解
2019/07/17 Python
Python利用requests模块下载图片实例代码
2019/08/12 Python
给老婆大人的检讨书
2014/02/24 职场文书
2014年三八妇女节活动方案
2014/02/28 职场文书
新生入学欢迎词
2015/01/26 职场文书
校友回访母校寄语
2015/02/26 职场文书
论语读书笔记
2015/06/26 职场文书
升学宴学生致辞
2015/09/29 职场文书