vue组件样式scoped

1.vue组件中的样式如果没加scrped,样式代表的是全局样式(避免组件之间样式的冲突)。加了属性代表是模块化的。

        

其他组件引用button组件

上面分析了单个组件渲染后的结果,那么组件互相调用之后会出现什么样的结果呢?,具体分两种情况:模块一般组件引用模块私有组件(本质和模块私有组件引用模块一般组件一样);模块私有组件引用模块私有组件。

举个例子:在组件content.vue中使用了button组件,那么content.vue组件是否添加scoped属性渲染出来的结果有什么区别呢?

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//content.vue
<template>
   <div class= "content" >
     <p class= "title" ></p>
     <!-- v-button假设是上面定义的组件 -->
     <v-button></v-button>
   </div>
</template>
...
<style>
   .content{
     width: 1200px;
     margin: 0 auto;
   }
   .content .button{
     border-raduis: 5px;
   }
</style>

模块一般组件(未添加scoped)引用模块私有组件

如果style上没有加scoped属性,那么渲染出来html和css分别就是:

?
1
2
3
4
5
6
7
< div class = "content" >
   < p class = "title" ></ p >
   <!-- v-button假设是上面定义的组件 -->
   < div data-v-2311c06a class = "button-warp" >
     < button data-v-2311c06a class = "button" >text</ button >
   </ div >
</ div >
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*button.vue渲染出来的css*/
.button-warp[data-v -2311 c 06 a]{
   display :inline- block ;
}
.button[data-v -2311 c 06 a]{
   padding : 5px 10px ;
   font-size : 12px ;
   border-radus: 2px ;
}
/*content.vue渲染出来的css*/
.content{
   width : 1200px ;
   margin : 0 auto ;
}
.content .button{
   border-raduis: 5px ;
}

可以看出,虽然在content组件中,修改了button的border-raduis属性,但是由于权重关系,生效的依然是组件内部的样式(此时是外部的样式被覆盖)。所以如果要达到修改样式的目的,就必须加重我们要修改样式的权重(增加选择器层级,ID选择器,并列选择器,impotant等)

模块私有组件(添加scoped)引用模块私有组件

如果加了scoped属性呢?按照开始分析出来的规则(事实也是这么的):

首先是在所有的DOM节点加上data属性

然后在css选择器尾部加上data属性选择器

那么渲染出来html和css分别就是:

?
1
2
3
4
5
6
7
< div data-v-57bc25a0 class = "content" >
   < p data-v-57bc25a0 class = "title" ></ p >
   <!-- v-button假设是上面定义的组件 -->
   < div data-v-57bc25a0 data-v-2311c06a class = "button-warp" >
     < button data-v-2311c06a class = "button" >text</ button >
   </ div >
</ div >
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*button.vue渲染出来的css*/
.button-warp[data-v -2311 c 06 a]{
   display :inline- block ;
}
.button[data-v -2311 c 06 a]{
   padding : 5px 10px ;
   font-size : 12px ;
   border-radus: 2px ;
}
/*content.vue渲染出来的css*/
.content[data-v -57 bc 25 a 0 ]{
   width : 1200px ;
   margin : 0 auto ;
}
.content .button[data-v -57 bc 25 a 0 ]{
   border-raduis: 5px ;
}

对于上面的两种情况,可以明显看出来渲染后的结果大不相同。

虽然我们在content添加了想要修改button组件的样式的代码,但是仔细看,由于.content .button这句在末尾加的是content组件的scoped标记,最后这句其实根本作用不到我们想要的DOM节点上,所以这种情况我们在content内部写的任何样式都不会影响到button.vue组件,所以这就尴尬了。。。。

当然这个问题也是可以解决的,就是直接加全局样式可以修改到,但这势必会影响全部地方的组件;所以需要另外一种方法在content.vue组件内再加一个不带scoped属性的style标签,也就意味着要加两个style,一个用于私有样式,一个用于共有样式。这肯定是有点shit的,并且这两种解决方案都回避不了一个问题:权重!!!

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//content.vue
<template>
   <div class= "content" >
     <p class= "title" ></p>
     <!-- v-button假设是上面定义的组件 -->
     <v-button></v-button>
   </div>
</template>
...
<style scoped>
   .content{
     width: 1200px;
     margin: 0 auto;
   }
</style>
<style>
   .content .button{
     border-raduis: 5px;
   }
</style>

这样符合规范么?貌似没看到不能这么写,并且这么写也确实生效了。。。但这样确实增加了思维的复杂度,有点苦恼啊。

2.

总结一下scoped三条渲染规则

  1. 给HTML的DOM节点加一个不重复data属性(形如:data-v-2311c06a)来表示他的唯一性
  2. 在每句css选择器的末尾(编译后的生成的css语句)加一个当前组件的data属性选择器(如[data-v-2311c06a])来私有化样式
  3. 如果组件内部包含有其他组件,只会给其他组件的最外层标签加上当前组件的data属性

转载于:https://www.cnblogs.com/huancheng/p/9120417.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue中,scoped样式是一种给组件样式添加作用域的方式,让样式组件内起作用,不会影响到其他组件。然而,有时候我们希望某个组件样式作用于其子组件或者父组件,这就需要穿透scoped样式。 对于子组件,我们可以通过使用`/deep/`或者`>>>`来穿透scoped样式。例如,在父组件样式中,可以这样定义: ``` <style scoped> .parent /deep/ .child { color: red; } </style> ``` 在上面的例子中,`.parent`是父组件样式,而`.child`是子组件样式。使用`/deep/`可以让`.child`样式作用于子组件。 对于父组件,如果想要穿透scoped样式,可以通过将样式定义在全局样式中,或者使用`>>>`。例如,在子组件中,可以这样定义: ``` <template> <div class="parent"> <div class="child">子组件样式</div> </div> </template> <style scoped> .child { color: red; } .parent >>> .child { color: blue; } </style> ``` 在上面的例子中,`.child`是子组件样式,`.parent`是父组件样式。使用`>>>`可以让`.child`样式作用于父组件。 需要注意的是,`/deep/`和`>>>`只在一些支持CSS Modules的构建工具中生效,例如vue-loader。如果在其他环境中使用,可能无法生效。 总结:通过使用`/deep/`或者`>>>`,我们可以穿透Vuescoped样式,让样式作用于子组件或者父组件。但是需要注意,这种方式只在部分构建工具中生效,不同环境可能会有差异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值