如何在VueJS单个文件组件中正确使用“作用域”样式?

VueJS上文档指出scoped应将样式限制为组件。但是,如果我创建两个具有相同baz样式的组件,它将从一个组件泄漏到另一个组件中:

foo.vue

<template>
<div class="baz">
  <Bar></Bar>
</div>
</template>

<style scoped>
.baz {
  color: red;
}
</style>

bar.vue

<template>
<div class="baz">bar</div>
</template>

<style scoped>
.baz {
  background-color: blue;
}
</style>

我希望这baz两个方面都会有所不同。但是生成网页后,我可以在蓝色背景上看到红色文本,这意味着foo的作用域样式会影响该bar组件。生成的代码如下所示:

<div class="baz" data-v-ca22f368>
  <div class="baz" data-v-a0c7f1ce data-v-ca22f368>
    bar
  </div>
</div>

如您所见,“泄漏”是VueJS通过在bar组件中指定两个数据属性而有意生成的但为什么?

小哥达蒙卡卡西2020/03/12 17:10:18

您可以阅读Vue加载程序的文档

子组件的根节点将同时受父组件的作用域CSS和子组件的作用域CSS的影响。

尽管这似乎有些令人困惑,但显然这是要执行的操作。

如果要避免这种情况,应该使用css模块

<template>
<div :class="$style.baz">
  <Bar></Bar>
</div>
</template>

<style module>
.baz {
  color: red;
}
</style>