Skip to content

Vuex 配置 ​

本节目标:理解“Vuex 配置”的核心思路,并能把它用于实际开发或面试表达。

说明:原 OneNote 中有图片引用,但图片未包含在导出目录中;本页保留了可用的文字与代码内容。

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。
这里我们先来看一下使用 CLI 生成的配置文件 store.js 中的内容:
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
  state: {
  },
  mutations: {
  },
  actions: {
  }
})
该配置文件便是 Vuex 的配置文件,主要有 4 个核心点:state、mutations、actions 及 getter,详细的介绍大家可以参考官方文档:[核心概念](https://vuex.vuejs.org/zh/guide/state.html),这里我用一句话介绍它们之间的关系就是:**我们可以通过** **actions** **异步提交** **mutations** **去** **修改** **state** **的值并通过** **getter** **获取**。
需要注意的是不是每一个项目都适合使用 Vuex,如果你的项目是中大型项目,那么使用 Vuex 来管理错综复杂的状态数据是很有帮助的,而为了后期的拓展性和可维护性,这里不建议使用 CLI 生成的一份配置文件来管理所有的状态操作,我们可以把它拆分为以下目录:
==└──== ==store======    ==├──== ==index.js==          ==#== ==我们组装模块并导出== ==store== ==的地方======    ==├──== ==actions.js==        ==#== ==根级别的== ==action======    ==├──== ==mutations.js==      ==#== ==根级别的== ==mutation======    ==└──== ==modules======        ==├──== ==moduleA.js==    ==# A====模块======        ==└──== ==moduleB.js==    ==# B====模块==
与单个 store.js 文件不同的是,我们按模块进行了划分,每个模块中都可以包含自己 4 个核心功能。比如模块 A 中:
/* moduleA.js */
const moduleA = {
  state: {
    text: 'hello'
  },
  mutations: {
    addText(state, txt) {
      // 这里的 `state` 对象是模块的局部状态
      state.text += txt
    }
  },
  actions: {
    setText({ commit }) {
      commit('addText', ' world')
    }
  },
  getters: {
    getText(state) {
      return state.text + '!'
    }
  }
}
export default moduleA
上方我们导出 A 模块,并在 index.js 中引入:
/* index.js */
import Vue from 'vue'
import Vuex from 'vuex'
import moduleA from './modules/moduleA'
import moduleB from './modules/moduleB'
import { mutations } from './mutations'
import actions from './actions'
Vue.use(Vuex)
export default new Vuex.Store({
  state: {
    groups: [1]
  },
  modules: {
    moduleA, // 引入 A 模块
    moduleB, // 引入 B 模块
  },
  actions, // 根级别的 action
  mutations, // 根级别的 mutations
  // 根级别的 getters
  getters: {
    getGroups(state) {
      return state.groups
    }
  }
})
这样项目中状态的模块划分就更加清晰,对应模块的状态我们只需要修改相应模块文件即可。详细的案例代码可参考文末 github 地址。

本站总访问 — 次