seb*_*lon 8 vue.js vue-router vuex vue-cli-3
我正在使用vue-cli3和npm开发单页应用程序。
问题:填充一个名为counter的基本整数值(以vuex状态存储),该值在后端到前端递增/递减,从而显示新值。
增量/减量突变在两个组件(前端/后端)上都可以正常工作,但似乎该突变不适用于同一路由实例:在后端中对计数器进行增减时,前端中的值不会更新否则。
store.js:
包含需要在后端/前端之间同步的状态。
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
counter: 10
},
mutations: {
increment (state) {
state.counter++
},
decrement (state) {
state.counter--
}
}
})
Run Code Online (Sandbox Code Playgroud)
index.js:
定义vue-router必须提供的路由。
import Vue from 'vue'
import Router from 'vue-router'
import Frontend from '@/components/Frontend'
import Backend from '@/components/Backend'
Vue.use(Router)
export default new Router({
routes: [
{
path: '/',
name: 'Frontend',
component: Frontend
},
{
path: '/backend',
name: 'Backend',
component: Backend
}
],
mode: 'history'
})
Run Code Online (Sandbox Code Playgroud)
main.js:
初始化Vue实例并提供全局存储和路由器实例。
import Vue from 'vue'
import App from './App'
import router from './router'
import { sync } from 'vuex-router-sync'
import store from './store/store'
Vue.config.productionTip = false
sync(store, router)
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')
Run Code Online (Sandbox Code Playgroud)
Frontend.vue / Backend.vue:
两者(前端/后端)在此处使用相同的代码。他们使用状态计数器来显示和修改它。
<template>
<div> Counter: {{ getCounter }}
<br>
<p>
<button @click="increment">+</button>
<button @click="decrement">-</button>
</p>
</div>
</template>
<script>
export default {
name: 'Frontend',
methods: {
increment () {
this.$store.commit('increment')
},
decrement () {
this.$store.commit('decrement')
}
},
computed: {
getCounter () {
return this.$store.state.counter
}
}
}
</script>
Run Code Online (Sandbox Code Playgroud)
如果有人告诉我我所缺少的东西,或者如果我误解了vuex和vue-router的概念,那将是非常棒的。
@sebikolon 中定义的组件属性data () => {}是反应性的,方法不是,它们被调用一次。而不是{{ getCounter }},只需使用{{ $store.state.counter }}. 或者在每个获取状态值的组件中启动属性。
data: function () {
return {
counter: $store.state.counter,
}
}
Run Code Online (Sandbox Code Playgroud)