Dynamically inserting a CSS class to navbar based on route

梦想的初衷 提交于 2019-12-03 14:47:40

There are multiple ways you can do it. I myself have different kind of headers depending of the page I am on.

One simple way can be to have some check on which route you are and depending on route change this variable. You can put a watch on $route, and whenever it changes, you can decide the value of colorNav depending on current route. Code will be something like:

<script>
  export default {
    data() {
      return {
        colorNav: false
      }
    }
  watch: {
    '$route' () {
      if (this.$route.path === '/somepage') {
        this. colorNav = true
      }
      else {
        this. colorNav = false
      }  
    }
  }
}
</script>

Another way to do it can be have this variable in some centralised state or vuex store and change this from each component's mounted block depending on requirement.

These answers helped me, but I ended up using a different solution. Your template also has access to $route so you can do something like this:

<template>
    <div>
        <div class="navbar" v-bind:class="{ 'color-nav': $route.path == '/somepage' }"></div>
        <router-view></router-view>
    </div>
</template>

The 'color-nav' class will be added if the $route.path is /somepage. I suppose this amounts to the same thing, but without having to add data properties or watchers. Once you have multiple possible classes, it could get messy though.

You can use in-component guards like:

  1. beforeRouteEnter (Does not have access to this of the vue instance)
  2. beforeRouteUpdate (Available v2.2 onwards)
  3. beforeRouteLeave

const Foo = {
  template: `...`,
  beforeRouteEnter (to, from, next) {

  },
  beforeRouteUpdate (to, from, next) {

  },
  beforeRouteLeave (to, from, next) {

  }
}

In each of the methods you have access to to and from variables which are the route objects containing the path.

So for your case you can use beforeRouteLeave, to know the to.path and accordingly modify your data property like so:

export default {
  data() {
    return {
      colorNav: false
    }
  },
  beforeRouteLeave (to, from, next) {
    if(to.path === '<your-route-name>') {
       this.colorNav = 'your-choice'
    }
    next() // Don't forget this
  }
}

If you forget call to next() your router won't proceed onto the route switching.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!