[TOC]
scoped的作用
- 官方解释:当
<style>
标签有scoped
属性时,它的 CSS 只作用于当前组件中的元素,即它不影响外面,外面的也不影响里面,不过外面的样式可以通过继承影响里面的样式。
- 深度解析:scoped的作用是编译后给当前组件每个dom加一个独有的hash值 (data-v-xxxx),假定为data-v-father,并且它的子组件的根元素也会加上这个hash值data-v-father,如果子组件style也是用来scoped则子组件每个dom元素也都有一个自己的hash值假定为data-v-child,所以子组件的根元素是有两个hash值的data-v-father和data-v-child.
|
|
编译后:(父组件hash是data-v-7ba5bd90,子组件hash是data-v-763db97b)
|
|
- scoped的效果会使得编译后的style中每个类名后面都会加上当前组件的hash值,如:
.classA[data-v-father]
,注意中间没有空格
|
|
编译后(当前组件hash值为data-v-7ba5bd90):
|
|
deep的作用
官方解释:如果你希望
scoped
样式中的一个选择器能够作用得“更深”,例如影响子组件,你可以使用>>>
操作符,有些像 Sass 之类的预处理器无法正确解析>>>
。这种情况下你可以使用/deep/
或::v-deep
操作符取而代之——两者都是>>>
的别名,同样可以正常工作深度解析:上面讲了scoped的作用是使的每个组件内的class编译后都会在后面加上一个hash值,这样在父组件里即使写了子组件某个class,它编译后跟子组件的class也是不一样的。因此,如果需要在父组件里覆盖子组件的样式,除了使用全局class,还可以用deep
deep的作用是在当前class前加上一个当前组件的hash值,并且去掉了scoped在后面加hash值的效果,如
[data-v-father] .classA
,注意中间是有空格的,由于子组件的根元素上是打了父组件hash值的,所以[data-v-father] .classA
是可以定位到子组件上.classA
元素的。注意:deep保险的使用方法是前面要加上上层选择器的,如
.wrap /deep/ .classA{}
,如果deep前面不加上层选择器
|
|
不同的loader版本会编译成不同的情况:
|
|
|
|
将会编译成
|
|
####