vuex状态管理

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,全局数据,兄弟组件共用的数据一般可以放在state中,主要有以下核心

  • State
  • Getter
  • Mutation
  • Action
  • Module

state
state是数据源,有人把state比喻为数据库,用来管理数据的地方

Getter
Getter比喻为API,是用来过滤数据,或者说一般不直接操作state(当然也是可以的),而是去通过getter函数获得数据

Mutaion
Mutation 提交状态修改。也就是set、get中的set,这是vuex中唯一修改state的方式,但不支持异步操作。第一个参数默认是state。
外部调用方式:store.commit(‘SET_AGE’, arg)。和vue中的methods类似。

actions
actions:和mutations类似。不过actions支持异步操作。第一个参数默认是和store具有相同参数属性的对象。
外部调用方式:store.dispatch(‘nameAsyn’)。

modules
modules:store的子模块,内容就相当于是store的一个实例。调用方式和前面介绍的相似,只是要加上当前子模块名,如:store.a.getters.xxx()。

项目组织结构

我的index.js文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
import actions from './actions.js'
import mutations from './mutations.js'
const state={
notes:[], //notes列表
activeNote:{} //一个当前note对象
}
const getters={
/*
Getters接收state作为其第一个参数
*/
notes:state=>state.notes,
//相当于notes:function(state){return state.notes}
activeNote:state=>state.activeNote
}
export default new Vuex.Store({
state,
mutations,
actions,
getters
})

action.js文件

1
2
3
4
5
6
7
8
9
10
11
12
const actions={
addNote({commit}){
commit('ADD_NOTE')
},
editNote({commit},text){
commit('EDIT_NOTE',text)
},
deleteNote({commit}){
commit('DELETE_NOTE')
}
}
export default actions

mutataion.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
const mutations={
//添加笔记
ADD_NOTE(state){
const newNote = {
/*
text:默认文字内容
favorite:收藏
*/
text:"new Note",
favorite:false
}
state.notes.push(newNote)
state.activeNote = newNote
},
//编辑笔记
EDIT_NOTE(state,text){ //编辑笔记
state.activeNote.text=text
},
//删除笔记
DELETE_NOTE(state){
for (var i=0; i<state.notes.length; i++){
if (state.notes[i] == state.activeNote){
state.notes.splice(i, 1)
}
}
state.activeNote = state.notes[0]
}
}
export default mutations

main.js文件

1
2
3
4
5
6
7
8
9
10
11
12
13
import Vue from 'vue'
import App from './App'
import router from './router'
import store from './store/index.js'
Vue.config.productionTip = false
/* eslint-disable no-new */
new Vue({
el: '#app',
router,
store,//使用store
components: { App },
template: '<App/>'
})

vuex的文件中类似这样书写,mutation是同步的,提交数据,store.commit(‘add’, arg),action是操作mutation的,store.dispatch(‘add’)