boki

by kordarei

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue-router/3.0.2/vue-router.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vuex/3.0.1/vuex.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pace/1.0.2/pace.min.js"></script>
<script src="https://unpkg.com/buefy/dist/buefy.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/buefy/dist/buefy.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/material-design-icons/3.0.1/iconfont/material-icons.min.css">
<html>

  <head>
    <meta charset="UTF-8">
    <title>Document</title>
  </head>

  <body>
    <div id="app">
   
      <router-view></router-view>
    </div>
  </body>

  <template id="userList">
    <ul>
      <li v-for='user in $store.state.userIndex'>
        <router-link :to="'/user/'.concat(user.id)">{{user.name}}</router-link>
      </li>
    </ul>
  </template>
  
   <template id="userShow">
    <div>
      <router-link to="/">Home</router-link>
      <p>name: {{$store.state.userData.name}}</p>
      <p>username: {{$store.state.userData.username}}</p>
      <p>email: {{$store.state.userData.email}}</p>
    </div>
  </template>

</html>

CSS

.pace {
  -webkit-pointer-events: none;
  pointer-events: none;
  -webkit-user-select: none;
  -moz-user-select: none;
  user-select: none;
}

.pace-inactive {
  display: none;
}

.pace .pace-progress {
  background: #7957d5;
  position: fixed;
  z-index: 2000;
  top: 0;
  right: 100%;
  width: 100%;
  height: 2px;
}

.pace .pace-progress-inner {
  display: block;
  position: absolute;
  right: 0px;
  width: 100px;
  height: 100%;
  box-shadow: 0 0 10px #7957d5, 0 0 5px #7957d5;
  opacity: 1.0;
  -webkit-transform: rotate(3deg) translate(0px, -4px);
  -moz-transform: rotate(3deg) translate(0px, -4px);
  -ms-transform: rotate(3deg) translate(0px, -4px);
  -o-transform: rotate(3deg) translate(0px, -4px);
  transform: rotate(3deg) translate(0px, -4px);
}

.pace .pace-activity {
  display: block;
  position: fixed;
  z-index: 2000;
  top: 15px;
  right: 15px;
  width: 14px;
  height: 14px;
  border: solid 2px transparent;
  border-top-color: #7957d5;
  border-left-color: #7957d5;
  border-radius: 10px;
  -webkit-animation: pace-spinner 400ms linear infinite;
  -moz-animation: pace-spinner 400ms linear infinite;
  -ms-animation: pace-spinner 400ms linear infinite;
  -o-animation: pace-spinner 400ms linear infinite;
  animation: pace-spinner 400ms linear infinite;
}

@-webkit-keyframes pace-spinner {
  0% {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(360deg);
    transform: rotate(360deg);
  }
}

@-moz-keyframes pace-spinner {
  0% {
    -moz-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  100% {
    -moz-transform: rotate(360deg);
    transform: rotate(360deg);
  }
}

@-o-keyframes pace-spinner {
  0% {
    -o-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  100% {
    -o-transform: rotate(360deg);
    transform: rotate(360deg);
  }
}

@-ms-keyframes pace-spinner {
  0% {
    -ms-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  100% {
    -ms-transform: rotate(360deg);
 ...

Vue

store = new Vuex.Store({
  state: {
    userIndex: [],
    userData: {}
  },
  mutations: {
    setIndex(state, data) {
      state.userIndex = data
    },
    setData(state, data) {
      state.userData = data
    }, 
    unsetData(state) {
      state.userData = {}
    }, 
  }
});

var UserIndex = Vue.component('user-index', {
  store,
  template: '#userList',
  mounted() {
  	axios.get('https://jsonplaceholder.typicode.com/users')
      .then(function(response){
        this.$store.commit('setIndex', response.data)
      }.bind(this))
  }
})

var UserShow = Vue.component('user-show', {
  store,
  template: '#userShow',
  mounted() {
  	axios.get('https://jsonplaceholder.typicode.com/users/'.concat(this.$route.params.id))
      .then(function(response){
      	this.$store.commit('setData', response.data)
      }.bind(this))
  },
  beforeDestroy() {
  	this.$store.commit('unsetData')
  }
})

const router = new VueRouter({
    routes: [
      { path: '/', component: UserIndex },
      { path: '/user/:id', component: UserShow }
  ]
})

new Vue({
	el:'#app',
  store,
  router
})