Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 也集成到 Vue 的官方调试工具 devtools extension,提供了诸如零配置的 time-travel 调试、状态快照导入导出等高级调试功能。
简单的 Store
目录结构
1 2 3 4
| |-src -main.js -store.js -App.vue
|
store.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) const state = { count: 10 } const actions = { increment({ commit }) { commit('increment') } } const mutations = { increment(state) { state.count++ } } const getters = { count(state) { return state.count } } export default new Vuex.Store({ state, actions, mutations, getters })
|
main.js
1 2 3 4 5 6
| import store from './store' new Vue({ store })
|
App.vue
组件的 html 部分
1 2 3 4 5 6 7
| <template> <div id="app"> <h3>welcome vuex-demo</h3> <input type="button" value="增加" @click="increment"> <div>{{count}}</div> </div> </template>
|
组件的 js 部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <script> import { mapActions, mapGetters } from 'vuex' export default { computed: mapGetters([ 'count' ]), methods: mapActions([ 'increment' ]) } </script>
|
这个简单的 store 中把所有的步骤都写在一个js文件里面,不方便维护和管理。
拆分开的独立文件
目录结构
1 2 3 4 5 6 7 8 9 10
| |-src -main.js |-store -actions.js -getters.js -index.js -mutations.js -types.js -state.js -App.vue
|
main.js
1 2 3 4 5 6
| import store from './store/index' new Vue({ store })
|
App.vue
组件的 html 部分
1 2 3 4 5 6 7
| <template> <div id="app"> <h3>welcome vuex-demo</h3> <input type="button" value="增加" @click="increment"> <div>{{count}}</div> </div> </template>
|
组件的 js 部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <script> import { mapActions, mapGetters } from 'vuex' export default { computed: mapGetters([ 'count' ]), methods: mapActions([ 'increment' ]) } </script>
|
state.js
需要维护和操作的数据
1 2 3 4
| export default { count: 20 }
|
types.js
定义一个类型文件,用来保存被提交的动作
1 2
| export const INCREMENT ='INCREMENT';
|
actions.js
通过 commit 提交一个方法出去到 mutations 中
1 2 3 4 5 6 7 8
| import * as types from './mutations-types'; export default { increment({ commit }) { commit(types.INCREMENT); } }
|
mutations.js
执行一个动作用来操作 state 中的某个数据
1 2 3 4 5 6 7 8
| import * as types from './mutations-types'; export default { [types.INCREMENT](state) { state.count++; } }
|
getters.js
将改变的数据进行返回出去给更新组件的数据状态
1 2
| export const count = state => state.count
|
index.js
入口文件,将整个store中的内容通过 new Vuex.Store() 导出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); import state from './state'; import actions from './actions'; import mutations from './mutations'; import * as getters from './getters' export default new Vuex.Store({ state, actions, mutations, getters });
|