scoped原理
在编译组件的时候,如果当前组件内style标签上有scoped属性,那么会在当前所有标签上添加一个data-v-hash属性
而当前样式表内的所有末尾选择器后面也会加上该属性,那么就使得当前组件内的样式只会作用于当前组件内的元素。
注意:
- 当父组件,子组件同时使用scoped属性时,子组件最外层的标签既会被加上当前组件的hash值,又会加上父级组件的hash值,如
<div data-v-b45036b2 data-v-384b136e ></div>
样式不生效问题
问题:
- 在当前组件内使用的scoped,无法在当前组件内改变子组件的样式(非最外层标签)
原因:
- 父组件内样式内解析的是父组件的hash值,而子组件内标签上添加的是子组件的hash值,对应不上即没效果
<style scoped>
.father-div .child-div{color:red;}
</style>
// 到了浏览器上会解析成
.father-div .child-div[data-v-b45036b2]{color:red;}
// 而标签上是这样的
<div data-v-384b136e></div>
解决办法
方法一
另写一个style标签,然后不加scoped属性,来盖子组件的样式
方法二
/deep/ 深度作用选择器
scss中使用::v-deep
.father-div /deep/ .child-div{color:red;}
// 当遇到"/deep/“的时候会将”/deep/"的位置替换成组件的hash值,解析成
.father-div[data-v-b45036b2] .child-div{color:red;}
// 这样只需要注意css的权重就可以覆盖子组件内的样式了
注意:
子组件内最外层的样式由于是带了父子组件的两个hash值,所以是会被两头控制的,不需要/deep/就可以在父组件内覆盖样式