Vue中的Vuex

简介

1、组成部分:(三个对象类型)
在这里插入图片描述

  1. Actions:用来接收从Vue Componts的方法和数值,如果需要去调用数值也可以先去调用成功数值后再传给Mutation
  2. Mutation:利用Action传来的方法和数据,真正对数据进行加工处理。注意,所有业务逻辑(比如条件判断等)都在Action中,Mutation中只负责进行数据运算与加工
  3. State:将处理好的结果返回给Vue Components

Note:Vuex中的三个部分都要收到store的管理

使用方法

  1. 安装vuex:npm i vuex
  2. 使用vuex:Vue.use(Vuex)
  3. 利用store管理Actions,Mutations,State
  4. 让所有的组件vc都能看得到stort

步骤一:安装vuex

Note:Vue2 中使用Vuex3;Vue3中使用Vuex4

npm i vuex@3

步骤二:使用vuex

(1)在main.js中加入如下语句:

//引入vuex
import Vuex from 'vuex'
//使用插件
Vue.use(Vuex)

(2)(官网推荐)在src中新建一个store文件,在store文件中新建index.js文件
在这里插入图片描述

步骤三:配置Vuex的环境

index.js

//该文件用于创建Vuex中最为核心的store

//引入vue
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'
//使用Vuex
Vue.use(Vuex)
//准备actions--用于响应组件中的动作
const actions = {}
//准备mutations--用于操作数据
const mutations = {}
//准备state--用于存储数据
const state = {}

//创建并到处store
export default new Vuex.Store({
	actions:actions,
	mutations:mutations,
	state:state
})

main.js

//引入vue
import Vue from 'vue'
//引入App
import App from './App.vue'
//引入插件
import vueResource from 'vue-resource'
//引入vuex
import Vuex from 'vuex'
//引入store
import store from './store/index.js'

Vue.config.productionTip = false
//使用插件
Vue.use(vueResource)

new Vue({
  render: h => h(App),
  store:store,
  beforeCreate() {
  	Vue.prototype.$but = this
  },
}).$mount('#app')

Count.vue

<template>
	<div>
		<h1>当前求和为:{{sum}}</h1>
		<select v-model.number="n">
			<option value="1">1</option>
			<option value="2">2</option>
			<option value="3">3</option>
		</select>
		<button @click="increment">+</button>
		<button @click="decrement">-</button>
		<button @click="incrementOdd">当前求和为奇数再加</button>
		<button @click="incrementWait">等一等再加</button>
	</div>
</template>

<script>
	export default {
		name:'Count',
		data(){
			return {
				n:1,//用户选择的数字
				sum:0 //当前和
			}
		},
		methods:{
			increment(){
				this.sum += this.n;
			},
			decrement(){
				this.sum -= this.n;
			},
			incrementOdd(){
				if(this.sum%2){
					this.sum += this.n;
				}
			},
			incrementWait(){
				setTimeout(()=>{
					this.sum += this.n
				},500)
			},
		},
		mounted() {
			//console.log('Count',this)
		}
	}
</script>

<style lang="css">
	button{
		padding: 5px;
	}
</style>

App.vue

<template>
    <div>
		<Count></Count>
	</div>
</template>

<script scoped>
	import Count from './components/Count.vue'
	export default {
		name:'App',
		components:{Count},
		mounted() {
			//console.log('App',this);
		}
	}
</script>

Note:因为js文件会先扫描出import文件执行后再去按顺序执行其他语句,所以main.js中如果写上import store from './store/index.js’会报错,因为需要先使用Vuex,而Vue.use(Vuex)会在import后执行。为了解决这个问题需要在index.js中先使用Vuex,如上图所示。

步骤四:实现功能

需要实现的功能:
(1)点击+n;
(2)点击-n;
(3)当前数字是奇数时可以+n;
(4)延迟0.5s+n;
(5)n可以选择为0,1,2;

代码实现:
Count.vue
Note:在state中的数据都要通过$state进行获取。

<template>
	<div>
		<h1>当前求和为:{{$store.state.sum}}</h1>
		<select v-model.number="n">
			<option value="1">1</option>
			<option value="2">2</option>
			<option value="3">3</option>
		</select>
		<button @click="increment">+</button>
		<button @click="decrement">-</button>
		<button @click="incrementOdd">当前求和为奇数再加</button>
		<button @click="incrementWait">等一等再加</button>
	</div>
</template>

<script>
	export default {
		name:'Count',
		data(){
			return {
				n:1,//用户选择的数字
			}
		},
		methods:{
			increment(){
				this.$store.commit('JIA',this.n);
			},
			decrement(){
				this.$store.commit('JIAN',this.n);
			},
			incrementOdd(){				
				this.$store.dispatch('jiaOdd',this.n);
			},
			incrementWait(){
				this.$store.dispatch('jiaWait',this.n);
			},
		},
		mounted() {
			//console.log('Count',this)
		}
	}
</script>

<style lang="css">
	button{
		padding: 5px;
	}
</style>

index.js

//该文件用于创建Vuex中最为核心的store

//引入vue
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'
//使用Vuex
Vue.use(Vuex)
//准备actions--用于响应组件中的动作
const actions = {
	// jia(context,value){
	// 	context.commit('JIA',value);
	// },
	// jian(context,value){
	// 	context.commit('JIAN',value);
	// },
	jiaWait(context,value){
		setTimeout(()=>{
			context.commit('JIA',value);
		},500);
	},
	jiaOdd(context,value){
		if(context.state.sum%2){ //注意这里必须是访问state的sum,如果直接访问sum是undefined
			context.commit('JIA',value);
		}
	},
}
//准备mutations--用于操作数据
const mutations = {
	JIA(state,value){
		state.sum += value;
	},
	JIAN(state,value){
		state.sum -= value;
	}
}
//准备state--用于存储数据
const state = {
	sum:0
}

//创建并到处store
export default new Vuex.Store({
	actions:actions,
	mutations:mutations,
	state:state
})

步骤五:getters配置项

当需要进行封装数据运算时可以使用getters配置项,需要在index.js中进行配置与actions,mutations,state配置类似,具体操作如下:
Count.vue

<template>
	<div>
		<h1>当前求和为:{{$store.state.sum}}</h1>
		<h1>当前求和放大十倍为:{{$store.getters.bigSum}}</h1>
		<select v-model.number="n">
			<option value="1">1</option>
			<option value="2">2</option>
			<option value="3">3</option>
		</select>
		<button @click="increment">+</button>
		<button @click="decrement">-</button>
		<button @click="incrementOdd">当前求和为奇数再加</button>
		<button @click="incrementWait">等一等再加</button>
	</div>
</template>

<script>
	export default {
		name:'Count',
		data(){
			return {
				n:1,//用户选择的数字
			}
		},
		methods:{
			increment(){
				this.$store.commit('JIA',this.n);
			},
			decrement(){
				this.$store.commit('JIAN',this.n);
			},
			incrementOdd(){				
				this.$store.dispatch('jiaOdd',this.n);
			},
			incrementWait(){
				this.$store.dispatch('jiaWait',this.n);
			},
		},
		mounted() {
			//console.log('Count',this)
		}
	}
</script>

<style lang="css">
	button{
		padding: 5px;
	}
</style>

index.js

//该文件用于创建Vuex中最为核心的store

//引入vue
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'
//使用Vuex
Vue.use(Vuex)
//准备actions--用于响应组件中的动作
const actions = {
	// jia(context,value){
	// 	context.commit('JIA',value);
	// },
	// jian(context,value){
	// 	context.commit('JIAN',value);
	// },
	jiaWait(context,value){
		setTimeout(()=>{
			context.commit('JIA',value);
		},500);
	},
	jiaOdd(context,value){
		if(context.state.sum%2){ //注意这里必须是访问state的sum,如果直接访问sum是undefined
			context.commit('JIA',value);
		}
	},
}
//准备mutations--用于操作数据
const mutations = {
	JIA(state,value){
		state.sum += value;
	},
	JIAN(state,value){
		state.sum -= value;
	}
}
//准备state--用于存储数据
const state = {
	sum:0
}
//准备getters配置项
const getters = {
	bigSum(state){
		return state.sum*10
	}
}

//创建并到处store
export default new Vuex.Store({
	actions:actions,
	mutations:mutations,
	state:state,
	getters:getters
})

变更需求

新需求:在页面中展示文字“我在尚硅谷学习前端”,尚硅谷,前端等学校,学科名称都存在vuex中。
效果如下图:
在这里插入图片描述
所需要的操作:
1、在index.js中添加school和subject属性,并设置为’尚硅谷‘和’前端‘;
2、在Count.vue文件中显示school和subject两个属性。
操作如下图所示:
在这里插入图片描述

在这里插入图片描述

但现在要进行对{{}}中的名称进行简写,可以利用mapState(),mapGetter()来实现。

mapState(),mapGetter()的语法介绍:
在这里插入图片描述

Count.vue

<template>
	<div>
		<h1>当前求和为:{{sum}}</h1>
		<h1>当前求和放大十倍为:{{bigSum}}</h1>
		<h1>我在{{school}}学习{{subject}}</h1>
		<select v-model.number="n">
			<option value="1">1</option>
			<option value="2">2</option>
			<option value="3">3</option>
		</select>
		<button @click="increment">+</button>
		<button @click="decrement">-</button>
		<button @click="incrementOdd">当前求和为奇数再加</button>
		<button @click="incrementWait">等一等再加</button>
	</div>
</template>

<script>
	import {mapState,mapGetters} from 'vuex'
	export default {
		name:'Count',
		data(){
			return {
				n:1,//用户选择的数字
			}
		},
		computed:{
			
			//借助mapState生成计算属性,从state中读取数据(对象写法)
			//...mapState({'sum':'sum','school':'school','subject':'subject'}),
			
			//借助mapGetters生成计算属性,从getters中读取数据(对象写法)
			//...mapGetters({'bigSum':'bigSum'}),
			
			//借助mapState生成计算属性,从state中读取数据(数组写法)
			...mapState(['sum','school','subject']),
			
			//借助mapGetters生成计算属性,从getters中读取数据(数组写法)
			...mapGetters(['bigSum']),
		},
		methods:{
			increment(){
				this.$store.commit('JIA',this.n);
			},
			decrement(){
				this.$store.commit('JIAN',this.n);
			},
			incrementOdd(){				
				this.$store.dispatch('jiaOdd',this.n);
			},
			incrementWait(){
				this.$store.dispatch('jiaWait',this.n);
			},
		},
		mounted() {
			//console.log('Count',this)
		}
	}
</script>

<style lang="css">
	button{
		padding: 5px;
	}
</style>

mapMutations 与 mapActions

在这里插入图片描述

Count.vue

<template>
	<div>
		<h1>当前求和为:{{sum}}</h1>
		<h1>当前求和放大十倍为:{{bigSum}}</h1>
		<h1>我在{{school}}学习{{subject}}</h1>
		<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 {mapState,mapGetters,mapMutations,mapActions} from 'vuex'
	export default {
		name:'Count',
		data(){
			return {
				n:1,//用户选择的数字
			}
		},
		computed:{
			
			//借助mapState生成计算属性,从state中读取数据(对象写法)
			//...mapState({'sum':'sum','school':'school','subject':'subject'}),
			
			//借助mapGetters生成计算属性,从getters中读取数据(对象写法)
			//...mapGetters({'bigSum':'bigSum'}),
			
			//借助mapState生成计算属性,从state中读取数据(数组写法)
			...mapState(['sum','school','subject']),
			
			//借助mapGetters生成计算属性,从getters中读取数据(数组写法)
			...mapGetters(['bigSum']),
		},
		methods:{
			/* increment(){
				this.$store.commit('JIA',this.n);
			},
			decrement(){
				this.$store.commit('JIAN',this.n);
			},
			incrementOdd(){				
				this.$store.dispatch('jiaOdd',this.n);
			},
			incrementWait(){
				this.$store.dispatch('jiaWait',this.n);
			}, */
			
			//借助mapActions生成方法,包含$state.dispathch()函数(对象写法)
			...mapActions({'incrementOdd':'jiaOdd','incrementWait':'jiaWait'}),
			//借助mapActions生成方法,包含$state.dispathch()函数(数组写法,但要求Count中名称与index.js中名称相同)
			//...mapActions(['incrementOdd':'jiaOdd','incrementWait':'jiaWait']),
			
			
			//借助mapMutations生成方法,包含$state.commit()函数(对象写法)
			...mapMutations({'increment':'JIA','decrement':'JIAN'}),
			//借助mapMutations生成方法,包含$state.commit()函数(数组写法,但要求Count中名称与index.js中名称相同)
			//...mapMutations(['JIA','JIAN']),
		},
		mounted() {
			//console.log('Count',this)
		}
	}
</script>

<style lang="css">
	button{
		padding: 5px;
	}
</style>




多组件共享数据(实现一个数据不同组件进行显示)

在这里插入图片描述
不同的组件在导入vuex后就可以使用vuex中的数据了,如果想要使用的简便还可以用mapState,mapGetters等映射方式自动生成计算属性,用mapMutations,mapActions自动生成方法。




Count.vue

<template>
	<div>
		<h1>当前求和为:{{sum}}</h1>
		<h1>当前求和放大十倍为:{{bigSum}}</h1>
		<h1>我在{{school}}学习{{subject}}</h1>
		<h3 style="color: red;">Person组件总人数是:{{personList.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 {mapState,mapGetters,mapMutations,mapActions} from 'vuex'
	export default {
		name:'Count',
		data(){
			return {
				n:1,//用户选择的数字
			}
		},
		computed:{
			
			//借助mapState生成计算属性,从state中读取数据(对象写法)
			//...mapState({'sum':'sum','school':'school','subject':'subject'}),
			
			//借助mapGetters生成计算属性,从getters中读取数据(对象写法)
			//...mapGetters({'bigSum':'bigSum'}),
			
			//借助mapState生成计算属性,从state中读取数据(数组写法)
			...mapState(['sum','school','subject','personList']),
			
			//借助mapGetters生成计算属性,从getters中读取数据(数组写法)
			...mapGetters(['bigSum']),
		},
		methods:{
			/* increment(){
				this.$store.commit('JIA',this.n);
			},
			decrement(){
				this.$store.commit('JIAN',this.n);
			},
			incrementOdd(){				
				this.$store.dispatch('jiaOdd',this.n);
			},
			incrementWait(){
				this.$store.dispatch('jiaWait',this.n);
			}, */
			
			//借助mapActions生成方法,包含$state.dispathch()函数(对象写法)
			...mapActions({'incrementOdd':'jiaOdd','incrementWait':'jiaWait'}),
			//借助mapActions生成方法,包含$state.dispathch()函数(数组写法,但要求Count中名称与index.js中名称相同)
			//...mapActions(['incrementOdd':'jiaOdd','incrementWait':'jiaWait']),
			
			
			//借助mapMutations生成方法,包含$state.commit()函数(对象写法)
			...mapMutations({'increment':'JIA','decrement':'JIAN'}),
			//借助mapMutations生成方法,包含$state.commit()函数(数组写法,但要求Count中名称与index.js中名称相同)
			//...mapMutations(['JIA','JIAN']),
		},
		mounted() {
			//console.log('Count',this)
		}
	}
</script>

<style lang="css">
	button{
		padding: 5px;
	}
</style>

Person.vue

<template>
	<div>
		<h1>人员列表</h1>
		<h3>Count组件的求和:{{sum}}</h3>
		<input type="text" placeholder="请输入名字" v-model="name" />
		<button @click="add">添加</button>
		<ul>
			<li v-for="p in personList" :key="p.id">{{p.name}}</li>
		</ul>
	</div>
</template>

<script>
	import {mapState} from 'vuex'
	import {nanoid} from 'nanoid'
	export default {
		name:'Person',
		data() {
			return {
				name:''
			}
		},
		computed:{
			...mapState(['personList']),
			sum(){
				return this.$store.state.sum
			}
		},
		methods:{
			add(){
				//创建一个人的类型
				const personObj = {id:nanoid(),name:this.name}
				//添加一个人,这里直接跳过Actions,调用Mutations,因为业务逻辑比较简单
				this.$store.commit('ADD_PERSON',personObj)
				//写完清空
				this.name = ''
			}
		}
	}
</script>

index.js

//该文件用于创建Vuex中最为核心的store

//引入vue
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'
//使用Vuex
Vue.use(Vuex)
//准备actions--用于响应组件中的动作
const actions = {
	// jia(context,value){
	// 	context.commit('JIA',value);
	// },
	// jian(context,value){
	// 	context.commit('JIAN',value);
	// },
	jiaWait(context,value){
		setTimeout(()=>{
			context.commit('JIA',value);
		},500);
	},
	jiaOdd(context,value){
		if(context.state.sum%2){ //注意这里必须是访问state的sum,如果直接访问sum是undefined
			context.commit('JIA',value);
		}
	},
}
//准备mutations--用于操作数据
const mutations = {
	JIA(state,value){
		state.sum += value;
	},
	JIAN(state,value){
		state.sum -= value;
	},
	ADD_PERSON(state,value){
		state.personList.unshift(value);
	}
}
//准备state--用于存储数据
const state = {
	sum:0,
	school:'尚硅谷',
	subject:'前端',
	personList:[
		{id:'001',name:'张三'}
	]
}
//准备getters配置项
const getters = {
	bigSum(state){
		return state.sum*10
	}
}

//创建并到处store
export default new Vuex.Store({
	actions:actions,
	mutations:mutations,
	state:state,
	getters:getters
})

Vuex的模块化编码

模块化目的:方便进行处理分析,防止git分支合并时报错。

namespaced

功能:使模块化后的内容能够被mapState等map方法访问到,如下图:
在这里插入图片描述
为了能达到上图的效果可以采用如下做法:(在index.js文件中添加)
在这里插入图片描述

模块化后的代码:
index.js

//该文件用于创建Vuex中最为核心的store

//引入vue
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'
//使用Vuex
Vue.use(Vuex)

//count组件模块
const countAbout = {
	namespaced:true,
	actions:{
		jiaWait(context,value){
			setTimeout(()=>{
				context.commit('JIA',value);
			},500);
		},
		jiaOdd(context,value){
			if(context.state.sum%2){ //注意这里必须是访问state的sum,如果直接访问sum是undefined
				context.commit('JIA',value);
			}
		},
	},
	mutations:{
		JIA(state,value){
			state.sum += value;
		},
		JIAN(state,value){
			state.sum -= value;
		},
	},
	state:{
		sum:0
	},
	getters:{
		bigSum(state){
			return state.sum*10
		}
	}
}

//person组件模块
const personAbout = {
	namespaced:true,
	actions:{},
	mutations:{
		ADD_PERSON(state,value){
			state.personList.unshift(value);
		},
	},
	state:{
		school:'尚硅谷',
		subject:'前端',
		personList:[
			{id:'001',name:'张三'}
		]
	},
	getters:{}
}


//创建并到处store
export default new Vuex.Store({
	modules:{
		countAbout:countAbout,
		personAbout:personAbout
	}
})

Count.vue

<template>
	<div>
		<h1>当前求和为:{{sum}}</h1>
		<h1>当前求和放大十倍为:{{bigSum}}</h1>
		<h1>我在{{school}}学习{{subject}}</h1>
		<h3 style="color: red;">Person组件总人数是:{{personList.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 {mapState,mapGetters,mapMutations,mapActions} from 'vuex'
	export default {
		name:'Count',
		data(){
			return {
				n:1,//用户选择的数字
			}
		},
		computed:{
			...mapState('countAbout',['sum']),
			...mapState('personAbout',['personList','school','subject']),
			...mapGetters('countAbout',['bigSum']),
		},
		methods:{
			...mapActions('countAbout',{'incrementOdd':'jiaOdd','incrementWait':'jiaWait'}),
			...mapMutations('countAbout',{'increment':'JIA','decrement':'JIAN'}),
		},
		mounted() {
			//console.log('Count',this)
		}
	}
</script>

<style lang="css">
	button{
		padding: 5px;
	}
</style>

Person.vue

<template>
	<div>
		<h1>人员列表</h1>
		<h3>Count组件的求和:{{sum}}</h3>
		<input type="text" placeholder="请输入名字" v-model="name" />
		<button @click="add">添加</button>
		<ul>
			<li v-for="p in personList" :key="p.id">{{p.name}}</li>
		</ul>
	</div>
</template>

<script>
	import {mapState} from 'vuex'
	import {nanoid} from 'nanoid'
	export default {
		name:'Person',
		data() {
			return {
				name:''
			}
		},
		computed:{
			...mapState('personAbout',['personList']),
			sum(){
				return this.$store.state.countAbout.sum
			}
		},
		methods:{
			add(){
				//创建一个人的类型
				const personObj = {id:nanoid(),name:this.name}
				//添加一个人,这里直接跳过Actions,调用Mutations,因为业务逻辑比较简单
				this.$store.commit('personAbout/ADD_PERSON',personObj)
				//写完清空
				this.name = ''
			}
		}
	}
</script>

新练习

目的:
1、从getters读取数据
2、dispatch去联系actions
3、Actions联系后端的API

index.js

//该文件用于创建Vuex中最为核心的store

//引入vue
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'
//使用Vuex
import axios from 'axios'
//引入nanoid
import {nanoid} from 'nanoid'
Vue.use(Vuex)

//count组件模块
const countAbout = {
	namespaced:true,
	actions:{
		jiaWait(context,value){
			setTimeout(()=>{
				context.commit('JIA',value);
			},500);
		},
		jiaOdd(context,value){
			if(context.state.sum%2){ //注意这里必须是访问state的sum,如果直接访问sum是undefined
				context.commit('JIA',value);
			}
		},
	},
	mutations:{
		JIA(state,value){
			state.sum += value;
		},
		JIAN(state,value){
			state.sum -= value;
		},
	},
	state:{
		sum:0
	},
	getters:{
		bigSum(state){
			return state.sum*10
		}
	}
}

//person组件模块
const personAbout = {
	namespaced:true,
	actions:{
		addPersonWang(context,value){
			if(value.name.indexOf("王") == 0){
				context.commit('ADD_PERSON',value);
			}
			else{
				alert('输入的人必须为姓王的人!!!');
			}
		},
		addPersonServer(context){
			axios.get('https://api.uixsj.cn/hitokoto/get?type=social').then(
				response => {
					context.commit('ADD_PERSON',{id:nanoid(),name:response.data})
				},
				error => {
					alert(error.message)
				}
			)
		}
	},
	mutations:{
		ADD_PERSON(state,value){
			state.personList.unshift(value);
		},
	},
	state:{
		school:'尚硅谷',
		subject:'前端',
		personList:[
			{id:'001',name:'张三'}
		]
	},
	getters:{
		firstPersonName(state){
			return state.personList[0].name;
		}
	}
}


//创建并到处store
export default new Vuex.Store({
	modules:{
		countAbout:countAbout,
		personAbout:personAbout
	}
})

Person.vue

<template>
	<div>
		<h1>人员列表</h1>
		<h3>Count组件的求和:{{sum}}</h3>
		<h3>列表中第一个人的名字是:{{firstPersonName}}</h3>
		<input type="text" placeholder="请输入名字" v-model="name" />
		<button @click="add">添加</button>
		<button @click="addWang">添加一个姓王的人</button>
		<button @click="addPersonServer">添加一个人,名字随机</button>
		<ul>
			<li v-for="p in personList" :key="p.id">{{p.name}}</li>
		</ul>
	</div>
</template>

<script>
	import {mapState} from 'vuex'
	import {nanoid} from 'nanoid'
	export default {
		name:'Person',
		data() {
			return {
				name:''
			}
		},
		computed:{
			...mapState('personAbout',['personList']),
			sum(){
				return this.$store.state.countAbout.sum
			},
			firstPersonName(){
				//注意模块化条件下getters内部的写法。
				return this.$store.getters['personAbout/firstPersonName']
			}
		},
		methods:{
			add(){
				//创建一个人的类型
				const personObj = {id:nanoid(),name:this.name}
				//添加一个人,这里直接跳过Actions,调用Mutations,因为业务逻辑比较简单
				this.$store.commit('personAbout/ADD_PERSON',personObj)
				//this.$store.dispatch('personAbout/addPersonWang',personObj)
				//写完清空
				this.name = ''
			},
			addWang(){
				//创建一个人的类型
				const personObj = {id:nanoid(),name:this.name}
				//添加一个人,这里直接跳过Actions,调用Mutations,因为业务逻辑比较简单
				//this.$store.commit('personAbout/ADD_PERSON',personObj)
				this.$store.dispatch('personAbout/addPersonWang',personObj)
				//写完清空
				this.name = ''
			},
			addPersonServer(){
				this.$store.dispatch('personAbout/addPersonServer')
			}
		}
	}
</script>

Count.vue

<template>
	<div>
		<h1>当前求和为:{{sum}}</h1>
		<h1>当前求和放大十倍为:{{bigSum}}</h1>
		<h1>我在{{school}}学习{{subject}}</h1>
		<h3 style="color: red;">Person组件总人数是:{{personList.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 {mapState,mapGetters,mapMutations,mapActions} from 'vuex'
	export default {
		name:'Count',
		data(){
			return {
				n:1,//用户选择的数字
			}
		},
		computed:{
			...mapState('countAbout',['sum']),
			...mapState('personAbout',['personList','school','subject']),
			...mapGetters('countAbout',['bigSum']),
		},
		methods:{
			...mapActions('countAbout',{'incrementOdd':'jiaOdd','incrementWait':'jiaWait'}),
			...mapMutations('countAbout',{'increment':'JIA','decrement':'JIAN'}),
		},
		mounted() {
			//console.log('Count',this)
		}
	}
</script>

<style lang="css">
	button{
		padding: 5px;
	}
</style>

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值