如何覆盖 Vue 组件中的作用域样式?

How to override scoped styles in Vue components?

让我们保存一下,我有一个 .Vue 组件,我从某处获取了 Github。我们称它为 CompB,我们将在其中添加一个 CSS rule-set 作为蓝色 header:

CompB.Vue(我不拥有的依赖项,可能来自 Github)

<template>
  ...
</template>

<script>
  ...
</script>

<style lang="scss" scoped>
  .compb-header {
    color: blue;
  }
</style>

我打算将 CompB 嵌套到我自己项目的 CompA 中。现在我有哪些覆盖范围规则的选项?

您需要为 css 添加更多特异性权重。您必须将该组件包装在另一个 class 中,以便您可以覆盖它。这是完整的代码

<template>
  <div class="wrapper">
    <comp-b>...</comp-b>
  </div>
</template>

<script>
import CompB from 'xxx/CompB'

export default {
  components: {
    CompB
  }
}
</script>

<style>
  .wrapper .compb-header {
    color: red;
  }
</style>

经过一番尝试,我想我找到了一个很好的方法。

  1. 全局覆盖

    对于我想在所有情况下覆盖 CompB 规则的情况,我可以添加一个更具体的规则集,如下所示:#app .compb-header { .. }。由于我们始终只有一个根 (#app),因此在规则集中使用 ID 是安全的。这很容易覆盖 CompB 中的范围规则。

  2. 家长覆盖

    对于我想同时覆盖全局和作用域规则的情况。值得庆幸的是,VueJS 允许将作用域和非作用域样式块添加到 .Vue 文件中。所以我可以添加一个更具体的 CSS 规则集。另请注意,我可以将 class 传递到 CompB 的道具中,因为 Vue 为所有组件提供了内置的 class 和样式道具:

    // in CompA (the parent)
    
    <template>
      ...
      <!-- Vue provides built-in class and style props for all comps -->
      <compb class="compb"></compb>  
    </template>
    
    <script>
      ...
    </script>
    
    <style lang="scss">
      #app .compb .compb-header { 
        color: red; 
      }
    </style>
    
    <style lang="scss" scoped>
      ...
    </style>
    

    (注意:你可以更具体一些,让你传递给 CompB 的 class 有一个更独特的名字,比如 .compa-compb 或一些哈希后缀,所以没有与使用 CompB 和 class .compb 的其他组件发生冲突的可能性。但我认为对于大多数应用程序来说这可能是过大的杀伤力。)

  3. 当然,CompB 可能会提供自己的额外道具,用于调整 CSS 或将 classes/styles 传递到组件区域。但是,当您使用不属于您的组件时(除非您分叉它),情况可能并非总是如此。另外,即使提供了这个,也总会有像 "I just want to adjust that padding just a bit!" 这样的情况。上面的两个解决方案似乎很适合这个。