Vue3 样式scoped 的原理

4 min read

在 Vue3 中,scoped 样式仍然使用了类似于 Vue2 中的原理,即通过给组件的根元素添加一个唯一的属性/类名,然后在组件内部使用这个属性/类名来限定样式的作用范围。

具体的原理如下:

  1. 当组件的 style 声明中包含了 scoped 属性时,Vue 编译器会自动将所有的选择器都添加一个针对该组件的唯一属性/类名。

  2. 为了生成唯一的属性/类名,Vue3 中使用了一个名为 data-v-[hash] 的属性/类名,并将该属性/类名添加到组件的根元素上,以达到样式的作用范围限定。

    例如,一个组件的根元素生成的属性/类名可能是 data-v-16aaeaf6

  3. 编译器会将组件的样式中的所有选择器都使用这个属性/类名进行限定,确保只有在该组件的根元素上添加了这个属性/类名的元素才会应用该样式。

    例如,样式选择器 .container 会被编译为 .container[data-v-16aaeaf6],这样样式只会应用到具有 data-v-16aaeaf6 属性的元素上。

这样,每个组件的样式都会被限定在组件的根元素上,避免了样式冲突的问题,同时也提供了更好的可维护性和封装性。