vue-router 2 template

Template for vue-router 2

by khamer

HTML

<script src="https://npmcdn.com/vue/dist/vue.js"></script>
<script src="https://npmcdn.com/vue-router/dist/vue-router.js"></script>

<div id="app">
  <router-link to="/home">/home</router-link>
  <router-link to="/foo">/foo</router-link>
  <div class="thing">
    <router-view :key="$route.fullPath"></router-view>
    <transition name="fade">
      <div v-if="showSpinner" class="lds-css ng-scope"><div style="width:100%;height:100%" class="lds-double-ring"><div></div><div></div></div></div>
    </transition>
  </div>
</div>

CSS

.thing {
  position: relative;
}

.fade-enter-active,
.fade-leave-active {
  transition: opacity 250ms ease;
}

.fade-enter,
.fade-leave-active {
  opacity: 0;
}

/* Spinner stuff Only Below */

@keyframes lds-double-ring {
  0% {
    -webkit-transform: rotate(0);
    transform: rotate(0);
  }
  100% {
    -webkit-transform: rotate(360deg);
    transform: rotate(360deg);
  }
}
@-webkit-keyframes lds-double-ring {
  0% {
    -webkit-transform: rotate(0);
    transform: rotate(0);
  }
  100% {
    -webkit-transform: rotate(360deg);
    transform: rotate(360deg);
  }
}
@keyframes lds-double-ring_reverse {
  0% {
    -webkit-transform: rotate(0);
    transform: rotate(0);
  }
  100% {
    -webkit-transform: rotate(-360deg);
    transform: rotate(-360deg);
  }
}
@-webkit-keyframes lds-double-ring_reverse {
  0% {
    -webkit-transform: rotate(0);
    transform: rotate(0);
  }
  100% {
    -webkit-transform: rotate(-360deg);
    transform: rotate(-360deg);
  }
}
.lds-css {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  display: flex;
  justify-content: center;
  background-color: #fff;
}
.lds-double-ring {
  position: relative;
}
.lds-double-ring div {
  position: absolute;
  width: 80px;
  height: 80px;
  top: 60px;
  left: 60px;
  border-radius: 50%;
  border: 8px solid #000;
  border-color: #20262e transparent #20262e transparent;
  -webkit-animation: lds-double-ring 4s linear infinite;
  animation: lds-double-ring 4s linear infinite;
}
.lds-double-ring div:nth-child(2) {
  width: 60px;
  height: 60px;
  top: 70px;
  left: 70px;
  border-color: transparent #20262e transparent #20262e;
  -webkit-animation: lds-double-ring_reverse 4s linear infinite;
  animation: lds-double-ring_reverse 4s linear infinite;
}
.lds-double-ring {
  width: 200px !important;
  height: 200px !important;
  -webkit-transform: translate(-100px, -100px) scale(1) translate(100px, 100px);
  transform: translate(-100px, -100px) scale(1) translate(100px, 100px);
}

Babel + JSX

const Foo = {
	template: `<div><h1 v-text="\`You're on \${$route.params.slug}\`"></h1></div>`,
  beforeRouteEnter(to, from, next) {
  	setTimeout(next, 2500);
  },
  beforeRouteUpdate(to, from, next) {
    setTimeout(next, 2500);
  }
};

const router = new VueRouter({routes: [{path: '/:slug', component: Foo}]});
router.beforeEach((to, from, next) => {
	router.app.showSpinner = true;
  next();
});

router.beforeResolve((to, from, next) => {
	router.app.showSpinner = false;
  next();
});

new Vue({
	router,
  el: '#app',
  data: {
  	showSpinner: true,
  },
})

router.push('/home');