如何使用vuex和vue-router在后端和前端之间同步状态?

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的概念,那将是非常棒的。

Oni*_*iel 0

@sebikolon 中定义的组件属性data () => {}是反应性的,方法不是,它们被调用一次。而不是{{ getCounter }},只需使用{{ $store.state.counter }}. 或者在每个获取状态值的组件中启动属性。

data: function () {
    return {
        counter: $store.state.counter,
    }
}
Run Code Online (Sandbox Code Playgroud)