<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>HTML5 + Vue + Router + Vuex</title> </head> <body> <div id="app"> <h1>HTML5 + Vue + Router + Vuex</h1> <p>{{ hello }}</p> <p>Counter: {{ counter }}</p> <ul> <li><router-link to="/">Home</router-link></li> <li><router-link to="/about">About</router-link></li> </ul> <div class="container"> <router-view></router-view> </div> </div> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script> <script src="https://unpkg.com/vuex"></script> <script> var Home = Vue.component('home', { data() { return { hello: 'Hello Home!', }; }, template: `<div> <h2>Home</h2> <p>{{ hello }}</p> <counter></counter> </div>` }); var About = Vue.component('about', { data() { return { hello: 'Hello About!' }; }, template: `<div> <h2>About</h2> <p>{{ hello }}</p> <counter></counter> </div>` }); var Counter = Vue.component('counter', { computed: { ...Vuex.mapState(['counter']) }, methods: { incCounter() { this.$store.commit('incCounter', 1); }, decCounter() { this.$store.commit('decCounter', 1); } }, template: `<div> Counter: {{ counter }} <button @click="incCounter">+</button> <button @click="decCounter">-</button> </div>` }); var router = new VueRouter({ // mode: 'history', routes: [ { path: '/', name: 'home', component: Home }, { path: '/about', name: 'about', component: About } ] }); var store = new Vuex.Store({ state: { counter: 0 }, mutations: { incCounter(state, delta) { state.counter += delta; }, decCounter(state, delta) { state.counter -= delta; } }, actions: { } }); var app = new Vue({ router, store, data() { return { hello: 'Hello Vue!' }; }, computed: { ...Vuex.mapState(['counter']) } }).$mount('#app'); </script> </body> </html>