Search code examples
cssvue.jsvuejs2vue-routerrouterlink

Cannot Remove Underline From Vue router-link


I think I tried almost everything trying to remove underline from router-link.

This is my code:

<router-link :to="{name: 'Plan'}">
   <div>Plan Your Trip</div>
      <div class='expander'>
      <router-link :to="{name: 'Plan'}">COVID-19</router-link>
      <router-link :to="{name: 'Plan'}">Visa</router-link>
      <router-link :to="{name: 'Plan'}">Essentials</router-link>
   </div>
</router-link>

I'm trying to remove underline from sub-links only.

Things I've tried:

In-line style

<router-link style="text-decoration: none !important;" :to="{name: 'Plan'}">COVID-19</router-link>

Assign class

<router-link class="sub-link" :to="{name: 'Plan'}">COVID-19</router-link>

<style scoped>
   .sub-link{text-decoration: none !important;}
</style>

Declare tag

<router-link tag="div" :to="{name: 'Plan'}">COVID-19</router-link>

<style scoped>
   div{text-decoration: none !important;}
</style>

Assign seperate tag + Declare class for that tag

<router-link :to="{name: 'Plan'}">
   <div class="sub-link">COVID-19</div>
</router-link>

These are just few lists, I literally tried every possible methods I can think of... Am I missing something about customizing Vue router-link?


Solution

  • Uses display: inline-block;text-decoration:none;, the trick is display: inline-block;.

    Css spec states

    For block containers that establish an inline formatting context, the decorations are propagated to an anonymous inline element that wraps all the in-flow inline-level children of the block container. For all other elements it is propagated to any in-flow children. Note that text decorations are not propagated to floating and absolutely positioned descendants, nor to the contents of atomic inline-level descendants such as inline blocks and inline tables.

    Example: The link COVID-19 in your codes will remove the underline.

    <router-link :to="{name: 'Plan'}">
       <div>Plan Your Trip</div>
          <div class='expander'>
          <router-link :to="{name: 'Plan'}" style="display: inline-block;text-decoration:none;">COVID-19</router-link>
          <router-link :to="{name: 'Plan'}">Visa</router-link>
          <router-link :to="{name: 'Plan'}">Essentials</router-link>
       </div>
    </router-link>
    

    Below is one demo:

    let Layout = {
      template: `<div>
      <h4>Layout Page </h4>
      <router-link to="/contact">
      <div>
        <p>Links<p>
        <router-link to="/contact/add" style="display: inline-block;text-decoration:none;">Add1</router-link>
        <router-link to="/addcontact">Add2</router-link>
      </div>
      </router-link>
      <router-view></router-view>
      </div>`
    };
    let Home = {
      template: '<div>this is the home page. Go to <router-link to="/contact">contact</router-link> </div>'
    };
    
    let ContactList = {
      // add <router-view> in order to load children route of path='/contact'
      template: '<div>this is contact list, click <router-link to="/contact/add">Add Contact In sub Router-View</router-link> here to add contact<p><router-view></router-view></p> Or Click <router-link to="/addcontact">Add Contact In Current Router-View</router-link></div>'
    };
    
    let ContactAdd = {
      template: '<div>Contact Add</div>'
    }
    
    let router = new VueRouter({
      routes: [{
        path: '/',
        redirect: 'home',
        component: Layout,
        children: [{
            path: 'home',
            component: Home
          },
          {
            path: 'contact',
            component: ContactList,
            children: [{
              path: 'add',
              component: ContactAdd
            }]
          },
          {
            path: 'addcontact', // or move ContactAdd as direct child route of path=`/`
            component: ContactAdd,
          }
        ]
      }]
    });
    
    new Vue({
      el: '#app',
      components: {
        'App': {
          template: '<div><router-view></router-view></div>'
        },
      },
      router
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
    <script src="https://unpkg.com/vue-router@3.0.1/dist/vue-router.js"></script>
    <section id="app">
      <app></app>
    </section>