Vuex (状态管理) 扫盲 (Vue2.x)

Vuex 状态管理

Vuex是Vue配套的公共数据管理工具,它可以把一些共享的数据,保存到Vuex中,方便整个程序中的任何组件直接获取或修改我们的公共数据。

Vuex是一个全局的共享数据存储区域,就相当于是一个数据的仓库。

  • 只有共享的数据,才有权利放到Vuex中
  • 组件内部私有的数据,只要放到组件的data中即可

Vuex是为了保存组件之间共享数据而诞生的,如果组件之间有要共享的数据,可以直接挂载到Vuex中,而不必通过 父子组件之间传值 了,如果组件的数据不需要共享,此时,这些不需要共享的私有数据,没有必要放到Vuex中。

props: 对外公开属性
data:  私有属性
Vuex:  全局共享属性
// 创建 Store 对象 => 数据仓储对象
cosnt store = new Vuex.Store({
  /*
    state属性: 需要共享的数据都定义在state属性对象中
      组件中调用: this.$store.state.xxx
  */
  state: { count: 0 },
  /*
    mutations属性:如果要皂搓store中的state值,通过mutations属性对象定义的方法,这是Vuex的规范
      组件中调用: this.$store.commit('方法名')
      [注]:最多支持2个参数
        param1: 永远是state属性
        param2: 由调用者传入,参数类型不限
      [注]:Vuex数据变更后有通知机制
  */
  mutations: {
    subtract(state, obj) {
      console.log(obj)
      state.count -= (obj.c + obj.d)
    }
  },
  /*
    包装数据
      当访问state中的数据,不是直接显示,而是需要包装一下。
      如果在每个组件中都去添加这个字符串,很糟糕的做法。
    Store对象中,通过定义getters方法,可以将state中的数据包装后对外提供,类似Vue中的过滤器功能。
    [注]
       1. getters只负责对外提供数据
       2. 调用方式: this.$store.getters.xxx
       3. 如果getters引用的state中的属性,发生变化了,
          就会立即触发getters的重新求值
  */
  getters: {
    currentCount(state) {
      return `当前的count = ${state.count}`
    }
  }
})

new Vue({
  render: h => h(App),
  // store对象挂载到VM实例中
  store
}).$mount('#app')