vue3就应该这样学-6

43 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情

上一期我们模版,这一期我们看一下组件中的样式。

style标签就是代表组件的样式,我们一般可以直接写。

<style>
这里写样式
</style>

但是这样写样式它是全局,是没有隔离。比如你在组件a中写了一个class名,在组件b中也写了,那么肯定某一个会被覆盖。

当然,你可以通过起一个不同class的名来规避这个问题,只要你不嫌烦。所以,vue推出了两种样式隔离的方法

  • scoped
  • module

样式隔离

style scoped

其实vue对每个组件都会标明一个id,那么借助这个ID,我们就可以实现样式隔离

image.png 当你给style标签加上scoped之后,vue编译css的时候就会把这个id加上。比如

<style scoped>
.a{}
</style>

那么这个css就会编译为.a[data-v-xxxx]{},这样就是实现了样式隔离。

style module

这种其实是vue版的css module。css module也是为了解决样式隔离,实现它有很多方案,但是我只说vue的方案。 当你给style标签加上module之后,vue编译css的时候就会生成一个随机的class名。比如

<style module>
.a{}
</style>

当我们使用的时候,稍微有点特殊,我们需要借助一个$style,<div :class="$style.a"></div>,将编译过随机的class名绑定正确,样式才能生效。

vue专用的选择器

vue里有一些专用的选择器,这些不是css的标准,其实你们可以把这个当作伪元素,用法都是:xx(selector)

slotted

这个主要是用于slot插槽,因为插槽很多时候被认为是是父组件的,如果你需要从子组件里修改父组件的,就可以用到这个.

deep

深度选择器,用于父组件改变子组件的样式,常用于修改一些三方组件库的样式

global

这个是用于在scoped的情况下,可以添加全局class的,作用不大

最惊喜的新功能:style v-bind

而在vue3中,最惊喜的莫过于子style中可以使用v-bind了,它其实说白了就是一个css 变量的hack

const a = ref('red')
<style scoped>
.a{
    color:v-bind('a')
}
</style>

这样完全摆脱了我们去绑定style,更加简单方便