# Vuex

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式

Vuex和单纯的全局对象的不同:

  • Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。

  • 不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex);

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  }
})
//通过 store.state 来获取状态对象,
console.log(store.state.count);
//通过 store.commit 方法触发状态变更
store.commit('increment');

export default store;

# state

单一状态树,一个对象就包含了全部的应用层级状态

在Vue组件中获得Vuex状态 Vuex 的状态存储是响应式的,从 store 实例中读取状态最简单的方法就是在计算属性中返回某个状态(当 store.state.count 变化的时候, 都会重新求取计算属性,并且触发更新相关联的 DOM),若使用data只在开始时候获取一次

// 会报错,Property or method "store" is not defined on the instance
{{count}}
<button @click="store.commit('increment',1)">
  +1
</button>

computed:{
  count(){
    return store.state.count;
  }
}
// 解决措施1:使用 add 方法
<button @click="add"> +1</button>

add(){
  store.commit('increment','1');
}

// 解决措施2: 使用 $store
add(){
  this.$store.commit('increment','1');
}

<button @click="$store.commit('increment','1')"> +1</button>

Vuex 通过 store 选项,提供了一种机制将状态从根组件“注入”到每一个子组件中(需调用 Vue.use(Vuex)),子组件能通过 this.$store 访问。

# mutations

mutations 里面的函数只能接受两个参数

// 第二个参数 使用 payload:{}
mutations:{
  setCurrentTag(state, id: string) {},
  updateTag(state, payload: { id: string, name: string }) {}
}