<div id="app">
  <ul class="nav">
  <li class="nav-item" @click="changeView('home')">
    <a class="nav-link">Home</a>
  </li>
  <li class="nav-item">
    <a class="nav-link" @click="changeView('shop')">Shop</a>
  </li>
  <li class="nav-item">
    <a class="nav-link" @click="changeView('contact')">Contact</a>
  </li>
</ul>
  <keep-alive>
    <component :is="view"></component>
  </keep-alive>
</div>
Vue.component("home", {
  template: `<div>home: {{count}}</div>`,
  activated(){
    this.count ++;
  },
  data(){
    return{
      count: 0
    }
  }
})
Vue.component("shop", {
  template: `<div @click='countOn()'>shop: {{count}}</div>`,
  data(){
    return{
      count: 0
    }
  },
  methods:{
    countOn(){
      this.count++;
    }
  }
})
Vue.component("contact", {
  template: `<div>contact</div>`
})

let app=new Vue({
  el: "#app",
  data: {
    view: "home"
  },
  methods: {
    changeView: function(tab){
      this.view=tab;
    }
  }
})

External CSS

  1. https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.11/vue.min.js