概念
在 Vue 中实现集中式状态(数据)管理的一个 Vue 插件,对 Vue 应用中多个组件的共享状态进行集中式的管理(读 / 写),也是一种组件间通信的方式,且适用于任意组件间通信
搭建vuex环境
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const actions = {}
const mutations = {}
const state = {}
export default new Vuex.Store({ actions, mutations, state })
|
- 在
main.js
中创建 vm 时传入 store 配置项
1 2 3 4 5 6 7 8 9 10 11
|
import store from './store'
new Vue({ el: '#app', render: h => h(App), store })
|
基本使用
- 初始化数据,配置 actions,配置 mutations,操作文件
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
| import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const actions = { jia(context,value) { context.commit('JIA',value) } }
const mutations = { JIA(state,value) { state.sum += value } }
const state = { sum: 0 }
export default new Vuex.Store({ actions, mutations, state })
|
- 组件中读取 vuex 中的数据:$store.state.sum
- 组件中修改 vuex 中的数据:$store.dispatch('action中的方法名',数据) 或 $store.commit('mutations中的方法名',数据)
备注:若没有网络请求或其他业务逻辑,组件中也可以越过 actions,即不写 dispatch,直接编写 commit
getters的使用
- 当 state 中的数据需要经过加工后再使用时,可以使用 getters 加工
- 在
store.js
中追加 getters 配置
- 组件中读取数据:$store.getters.bigSum
1 2 3 4 5 6 7 8 9 10 11 12
| const getters = { bigSum(state) { return state.sum * 10 } }
export default new Vuex.Store({ getters })
|
四个map方法的使用
导入
1
| import {mapState, mapGetters, mapActions, mapMutations} from 'vuex'
|
mapState
用于帮助我们映射 state 中的数据为计算属性
1 2 3 4 5 6 7
| computed: { ...mapState({sum:'sum', school:'school', subject:'subject'}), ...mapState(['sum', 'school', 'subject']) }
|
mapGetters
用于帮助我们映射 getters 中的数据为计算属性
1 2 3 4 5 6 7
| computed: { ...mapGetters({bigSum:'bigSum'}), ...mapGetters(['bigSum']) }
|
mapActions
用于帮助我们生成与 actions 对话的方法,即:包含 $store.dispatch(xxx)
的函数
1 2 3 4 5 6 7
| methods: { ...mapActions({incrementOdd:'jiaOdd', incrementWait:'jiaWait'}), ...mapActions(['jiaOdd', 'jiaWait']) }
|
mapMutations
用于帮助我们生成与 mutations 对话的方法,即:包含 $store.commit(xxx)
的函数
1 2 3 4 5 6 7
| methods: { ...mapMutations({increment:'JIA',decrement:'JIAN'}), ...mapMutations(['JIA','JIAN']) }
|
备注:mapActions 与 mapMutations 使用时,若需要传递参数需要:在模板中绑定事件时传递好参数,否则传的参数是事件对象 event
模块化+命名空间
在 Vuex 中,使用 namespaced: true
可以启用模块命名空间功能。启用后,模块的所有内容(如 state、mutations、actions、getters)都将被封装在该模块的命名空间内。这样可以有效避免不同模块内部的命名冲突,并提供更好的代码组织和可维护性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| const countAbout = { namespaced: true, state: { }, mutations: { }, actions: { }, getters: { } }
const store = new Vuex.Store({ modules: { moduleA } });
|
1 2 3 4
| this.$store.state.countAbout.list
...mapState('countAbout',['sum','school','subject'])
|
- 开启命名空间后,组件中读取 getters 数据:
1 2 3 4
| this.$store.dispatch('countAbout/jiaOdd', 666)
...mapActions('countAbout', { incrementOdd: 'jiaOdd',incrementWait: 'jiaWait' })
|
1 2 3 4
| this.$store.commit('personAbout/ADD_PERSON',person)
...mapMutations('countAbout',{ increment: 'JIA',decrement: 'JIAN' }),
|