先不说原理,直接说使用吧,用着用着就 明白了vue
A: 需求:es6
在项目中,组件之间是独立的,组件之间要想实现通讯,父子之间通讯能够用props选项,可是兄弟之间的通讯就比较复杂vuex
B: 简单理解:缓存
若是在state中定义一个数据以后,咱们能够在项目中的任何一个组件里获取和修改,而且咱们的修改能够获得全局的相应变动 好比bash
let state = {
userList: [], // 用户列表
}
这个userList里的数据,能够在全局使用
复制代码
C: vuex种的五个基本属性app
1, 咱们能够经过this.$store在vue的组件中获取vuex的实例异步
2, State:vuex中的数据源,能够经过thsi.$store.state获取在vuex中声明的全局变量的值ide
3, Getter:至关于vue中的computed(计算属性),能够用于监听/计算state中值的变化模块化
4, Mutation: vuex中提交更改数据的方法(只能同步执行)函数
5, Action:
6, Module: 模块化vuex
import Vue from 'vue'
import Vuex from 'vuex' // 引入vuex
Vue.use(Vuex)
const store = new Vuex.Store(); // 实例化
export default store
复制代码
import store from './store' //引入store
new Vue({
el: '#app',
router,
store, //使用store
template: '<App/>',
components: { App }
})
复制代码
说明: vuex使用单一状态树,state是惟一数据源,因此每一个莹莹仅包含一个store实例,
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const state = { //要设置的全局访问的state对象
showHello: true,
changeNum: 0
//要设置的初始属性值
}
const store = new Vuex.Store({
state
})
export default store
复制代码
说明: 作完这个以后,咱们就能够在任何组件里面使用this.%store.showHello和this.%store.changeNum来获取定义的值了
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const state={ //要设置的全局访问的state对象
showHello: true,
changeNum: 0
//要设置的初始属性值
}
const getters = { //实时监听state值的变化(最新状态)
isShow(state) { //方法名随意,主要是来承载变化的showHellor的值
return state.showHello
},
getChangedNum() { //方法名随意,主要是用来承载变化的changeNum的值
return state.changeNum
}
}
const store = new Vuex.Store({
state,
getters
});
export default store;
复制代码
更改vuex的store中的状态的惟一方法就是提交mutation,vuex中的mutation很是相似事件,就是每一个mutation都有一个字符串的事件类型(type)和一个回调函数(handler),这个回调函数就是咱们实际进行状态更改的地方,而且它会接受state做为第一个参数
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const state={ //要设置的全局访问的state对象
showHellor: true,
changeNum:0
//要设置的初始属性值
};
const getters = { //实时监听state值的变化(最新状态)
isShow(state) { //承载变化的showHellor的值
return state.showHellor
},
getChangedNum(){ //承载变化的changebleNum的值
return state.changeNum
}
};
const mutations = {
show(state) { //自定义改变state初始值的方法,这里面的参数除了state以外还能够再传额外的参数(变量或对象);
state.showHellor = true;
},
hide(state) { //同上
state.showHellor = false;
},
newNum(state, sum){ //同上,这里面的参数除了state以外还传了须要增长的值sum
state.changeNum += sum;
}
};
复制代码
6, 这个时候就能够用 this.$store.commit('show') 或
this.$store.commit('hide') 以及
this.$store.commit('newNum',6)在别的组件里面进行改变showHello和changeNum的值了
7, 可是在vuex中,mutation里的方法都是同步,意思就是,好比这个this.$store.commit('newNum',sum)方法,
两个组件里用执行获得的值,每次都是同样的,显然不是咱们须要的,vuex还提供了actions,把action也放入Vuex.Store里面,这个actions也是对象变量,里面的Action方法,能够包含任意异步操做,这里的异步就是用异步发出mutation里面的方法,action里面的自定义函数接受一个context参数和要变化的形参
// 实践中咱们能够用es6参数解构来剪发代码
actions: {
increment ({ commit }) {
commit('increment')
}
}
复制代码
context和store实例具备相同的属性和方法,能够调用context.commit()提交一个mutation,或者经过context.state和context.getter来偶去state和getter
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
const state={ //要设置的全局访问的state对象
showHello: true,
changeNum:0
//要设置的初始属性值
};
const getters = { //实时监听state值的变化(最新状态)
isShow(state) { //承载变化的showHello的值
return state.showHello
},
getChangedNum(){ //承载变化的changebleNum的值
return state.changeNum
}
};
const mutations = {
show(state) { //自定义改变state初始值的方法,这里面的参数除了state以外还能够再传额外的参数(变量或对象);
state.showHello = true;
},
hide(state) { //同上
state.showHello = false;
},
newNum(state,sum){ //同上,这里面的参数除了state以外还传了须要增长的值sum
state.changeNum += sum;
}
};
const actions = {
hideHello(context) { //自定义触发mutations里函数的方法,context与store 实例具备相同方法和属性
context.commit('hide');
},
showHello(context) { //同上注释
context.commit('show');
},
getNewNum(context, num){ //同上注释,num为要变化的形参
context.commit('newNum', num)
}
};
const store = new Vuex.Store({
state,
getters,
mutations,
actions
});
export default store;
复制代码
action 经过 store.dispatch 方法触发
在外部组件进行全局执行actions里面的方法的时候,你只须要执行
this.$store.dispatch('hideHello')
或this.$store.dispatch('showHello')
以及this.$store.dispatch('getNewNum', 6) //6要变化的实参