Vuex
1、理解Vuex
1.1、Vuex是什么?
在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。
1.2.何时使用?
多个组件需要共享数据时
1.3.Vuex工作原理
1,具体流程:
插件里调用dispatch方法去找Actions,然后Actions里帮你调用commit找Mutations,然后由Mutations去调用Mutate去找State,然后State修改数据后重新渲染组件。
2,就像去餐厅吃饭的流程:客人->服务员->后厨->菜->你
2、搭建vuex环境
①创建文件:src/store/index.js
//引入Vue核心库
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'
//应用Vuex插件
Vue.use(Vuex)
//准备actions对象——响应组件中用户的动作
const actions = {}
//准备mutations对象——修改state中的数据
const mutations = {}
//准备state对象——保存具体的数据
const state = {}
//创建并暴露store
export default new Vuex.Store({
actions,
mutations,
state
})
②在main.js中创建vm时传入store配置项
在vue脚手架里,它会扫描代码里所有的import,先执行所有的引入操作,然后再执行其它的代码,包括使用等,所以,在两个import之间存在其它代码也不会打断它会先执行所有improt引入操作。
......
//引入store
import store from './store'
......
//创建vm
new Vue({
el:'#app',
render: h => h(App),
store
})
3、vuex基本使用
①初始化数据、配置actions、配置mutations,操作文件store.js
//引入Vue核心库
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'
//引用Vuex
Vue.use(Vuex)
const actions = {
//响应组件中加的动作
jia(context,value){
// console.log('actions中的jia被调用了',miniStore,value)
context.commit('JIA',value)
},
}
const mutations = {
//执行加
JIA(state,value){
// console.log('mutations中的JIA被调用了',state,value)
state.sum += value
}
}
//初始化数据
const state = {
sum:0
}
//创建并暴露store
export default new Vuex.Store({
actions,
mutations,
state,
})
②组件中读取vuex中的数据:$store.state.sum
③组件中修改vuex中的数据:$store.dispatch('action中的方法名',数据) 或 $store.commit('mutations中的方法名',数据)
备注:若没有网络请求或其他业务逻辑,组件中也可以越过actions,即不写dispatch,直接编写commit
4、求和案例
4.1、使用纯vue编写
src\App.vue
src\components\Count.vue
当前求和为:{{sum}}
4.2、使用纯Vuex编写
搭配好Vuex环境,vuex插件3.0下载命令:npm i vuex@3
src\store\index.js
//该文件用于创建Vuex中最核心的Store
//引入Vuex
import Vue from "vue"
//引入vuex插件
import Vuex from "vuex";
//使用vuex插件
Vue.use(Vuex);
//准备actions,---用于响应组件中的动作
const actions={
//下面代码没有业务逻辑,直接在外面使用commit调用即可。
// jia:function(context,value){
// //console.log("jia被调用了");
// context.commit("JIA",value);
// },
// jian:function(context,value){
// context.commit("JIAN",value);
// },
jiaOdd(context,value){
console.log("处理了一些复杂逻辑...");
//交给jiaOddTest处理
context.dispatch("jiaOddTest",value);
},
jiaOddTest(context,value){
if(context.state.sum%2){
context.commit("JIA",value);
}
},
jiaWait(context,value){
//console.log("jiaWait被调用了");
setTimeout(() => {
context.commit("JIA",value);
}, 500);
}
}
//准备mutations,---用于操作数据(state)
const mutations={
JIA(state,value){
//console.log("mutations中的JIA被调用了");
state.sum+=value;
},
JIAN(state,value){
//console.log("mutations中的JIA被调用了");
state.sum-=value;
},
}
//准备state,---用于存储数据
const state={
sum:0,//当前的和
}
//创建store并导出
export default new Vuex.Store({
actions,
mutations,
state
})
src\App.vue
src\components\Count.vue
当前求和为:{{$store.state.sum}}