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







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