Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to override scoped styles in Vue components?

Let's save I have a .Vue component that I grab off of Github somewhere. Let's call it CompB and we'll add a single CSS rule-set there for a blue header:

CompB.Vue (a dependency I don't own, perhaps pulled from Github)

<template>
  ...
</template>

<script>
  ...
</script>

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

I plan to nest CompB into my own project's CompA. Now what are my options for overriding the scoped rule?

like image 498
prograhammer Avatar asked Dec 14 '16 02:12

prograhammer


People also ask

How do you override scoped CSS Vue?

The only way to override the css is to get higher points of specificity. For example, adding the class . btn to the selector gets the same two points but it still looses because of the order of precedence.

What is scoped style in Vue?

Scoped styles allow us to apply CSS to the components element only. Which ultimately enables us to mix local component and global application styles. In this lesson, we'll learn how to use scoped styles in our Single File Components and what to be aware of when using them.

What is the difference between scoped and non scoped CSS?

If you add css in global file you can import any where , but when you are doing with scoped css it will connect styling with respective component only.

How do I apply for CSS at Vue?

Adding CSS classes in Vue We should apply the button CSS classes to the <button> in our ToDoForm component. Since Vue templates are valid HTML, this is done in the same way to how you might do it in plain HTML — by adding a class="" attribute to the element.


1 Answers

After playing around a bit, I think I've got a good approach.

  1. Global overrides

    For situations where I want to override the rules in all cases for CompB I can add a rule-set with more specificity like this: #app .compb-header { .. }. Since we always only have one root (#app) it's safe to use an ID in the rule-set. This easily overrides the scoped rules in CompB.

  2. Parent overrides

    For situations where I want to override both the global and scoped rules. Thankfully VueJS allows adding both a scoped and unscoped style block into a .Vue file. So I can add an even more specific CSS rule-set. Also notice I can pass a class into CompB's props since Vue provides built-in class and style props for all components:

    // 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>
    

    (note: You can get more specific and make the class you pass into CompB have a more unique name such as .compa-compb or some hash suffix so there is no potential for collision with other components that use CompB and a class .compb. But I think that might be overkill for most applications.)

  3. And of course CompB may provide its own additional props for adjusting CSS or passing classes/styles into areas of the component. But this may not always be the case when you use a component you don't own (unless you fork it). Plus, even with this provided, there is always those situations where you are like "I just want to adjust that padding just a bit!". The above two solutions seem to work great for this.

like image 124
prograhammer Avatar answered Oct 12 '22 01:10

prograhammer