我不喜欢去银行,就好像太监不喜欢去妓院一样,有些东西你没有,去了也是难受。
【24.Vuex中的多组件状态共享】
 
页面展示:

vuex数据共享完整代码:
App.vue和main.js:就不展示了。
store/index.js
//该文件用于创建Vuex中最为核心的store
import Vue from 'vue';
//引入Vuex
import Vuex from 'vuex';
//应用Vuex插件
Vue.use(Vuex);
//准备actions——用于响应组件中的动作【接收组件派发过来的方法】
const actions = {
	jiaOdd(context, value) {
		console.log('actions中的jiaOdd被调用了');
		// 这里可以访问到state里存储的数据 sum
		if (context.state.sum % 2) {
			context.commit('JIA', value);
		}
	},
	jiaWait(context, value) {
		console.log('actions中的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中的JIAN被调用了');
		state.sum -= value;
	},
  // 添加人员信息
  addPerson(state,value){
    console.log('mutations中的addPerson被调用了')
    console.log('addPerson',value);
    // array.unshift(A):把A放在array中的第一个;这样添加的数据是响应式的。
    state.personLists.unshift(value);
  },
};
//准备getters——用于将state中的数据进行加工【配置定义getters】
const getters = {
	bigSum(state,getters) {
    // console.log('getters第一个参数:',state);
    // console.log('getters第二个参数:',getters);
    return state.sum*10
  },
};
//准备state——用于存储数据
//数据,相当于data
const state = {
	sum: 0, //当前的和
  Sname:'伍六七',
  Sjob:'理发师',
  personLists:[{id:'001',name:'伍六七'}],
};
//创建并暴露store
export default new Vuex.Store({
	// property 简写 (用在对象某个 property 的 key 和被传入的变量同名时)
	actions,
	mutations,
	state,
  // 在store中声明getters
  getters,
});
Count.vue
<template>
	<div>
		<h1>当前求和为:{{ sum }}</h1>
		<h3>当前求和放大10倍为:{{ bigSum }}</h3>
		<h3>我叫{{ Sname }},是一名{{ Sjob }}</h3>
    <h3 style="color:red">Person组件的总人数是:{{personLists.length}}</h3>
		<select v-model.number="n">
			<option value="1">1</option>
			<option value="2">2</option>
			<option value="3">3</option>
		</select>
		<button @click="increment(n)">+</button>
		<button @click="decrement(n)">-</button>
		<button @click="incrementOdd(n)">当前求和为奇数再加</button>
		<button @click="incrementWait(n)">等一等再加</button>
	</div>
</template>
<script>
import { mapGetters, mapState, mapMutations, mapActions } from 'vuex';
export default {
	name: 'Count',
	data() {
		return {
			n: 1,
		};
	},
	computed: {
		//#region
		//借助mapGetters生成计算属性,从getters中读取数据。(对象写法)
		// ...mapGetters({bigSum:'bigSum'})
		//借助mapGetters生成计算属性,从getters中读取数据。(数组写法)
		...mapGetters(['bigSum']),
		//#endregion
		//#region
		// 2.不借助mapState
		//借助mapState生成计算属性,从state中读取数据。(对象写法)
		// ...mapState({sum:'sum',Sjob:'Sjob',Sname:'Sname'}),
		//借助mapState生成计算属性,从state中读取数据。(数组写法)
		...mapState(['sum', 'Sjob', 'Sname','personLists']),
		//#endregion
	},
	methods: {
		//**********借助mapMutations方法****************
		//借助mapMutations生成对应的方法,方法中会调用commit去联系mutations(对象写法)
		...mapMutations({ increment: 'JIA', decrement: 'JIAN' }),
		//借助mapMutations生成对应的方法,方法中会调用commit去联系mutations(数组写法)
		// ...mapMutations([ 'JIA', 'JIAN' ]),
		//**********借助mapMutations方法****************
		//借助mapActions生成对应的方法,方法中会调用dispatch去联系actions(对象写法)
		...mapActions({ incrementOdd: 'jiaOdd', incrementWait: 'jiaWait' }),
		//借助mapActions生成对应的方法,方法中会调用dispatch去联系actions(数组写法)
		// ...mapActions(['jiaOdd','jiaWait'])
	},
	mounted() {
		console.log('Count', this.$store);
	},
};
</script>
<style scoped>
button {
	margin-left: 10px;
}
select {
	margin-left: 20px;
}
</style>
Person.vue
<template>
	<div>
		<h1>人员列表</h1>
		<h3 style="color: red">Count组件求和为:{{ sum }}</h3>
		<input type="text" placeholder="请输入名字" v-model="iptName" />
		<button @click="addPerson">添加</button>
		<ul>
			<li v-for="p in personLists" :key="p.id">{{ p.name }}</li>
		</ul>
	</div>
</template>
<script>
import { mapState } from 'vuex';
import {nanoid} from 'nanoid';
export default {
	name: 'Person',
	data() {
		return {
			iptName: '',
		};
	},
	computed: {
		// 完整版代码
		/* 	personLists() {
			return this.$store.state.personLists;
		},
		sum() {
			return this.$store.state.sum;
		}, */
		// 简写
		...mapState(['personLists', 'sum']),
	},
	methods: {
		addPerson() {
			const personObj = {id:nanoid(),name:this.iptName}
            this.$store.commit('addPerson', personObj)
            // 然后清空input框
            this.iptName=''
		},
	},
};
</script>


















