Vue Vuex共享数据案例

1、概念

  专门在 Vue 中实现集中式状态(数据)管理的一个 Vue 插件,对 vue 应 用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方 式,且适用于任意组件间通信。

1.1、Vuex工作原理

在这里插入图片描述

  • Actions
    值为一个对象,包含多个响应用户动作的回调函数。通过使用commit()用来触发Mutations中的函数调用,进而间接的修改state中的数据。使用==$store.dispatch(‘参数1’,‘参数2’),参数1为action回调明,参数2用于传递值。 ==
  • Mutations
    值为一个对象,包含多个直接更新state的方法。调用方法:在action中使用commit(‘Mutation中的方法名’)触发
  • State
    Vuex管理的状态对象,它应该是唯一的。用于存储共享数据

1.2、Actions、Mutations、State示例

Actions

const actions = {
	add(context, value) {
		// context是上下文对象,value是所传数据(可选,也可以不传)
		console.log(context + value);
		// 触发Mutations中的ADD方法
		context.commit("ADD", value)
	}
}

Mutations

const mutations = {
	ADD(state, value) {
		// state中存储这共享数据,value是传过来的数据
		console.log(state, value);
		// 修改state中的数据
		state.salesTicket += value
	}
}

State

const state = {
	sumTicket: 100,
	salesTicket: 0
}

2、不同窗口卖票,共享总票数

2.1、效果

不同的窗口组件都可以使用总票数数据。
在这里插入图片描述

2.2、后台组件BackStage

<template>
	<div>
		<h2>后台数据</h2>
		<h3>总票数:{{sumTicket}}</h3>
		<h3>剩余票数:{{sumTicket-salesTicket}}</h3>
	</div>
</template>

<script>
	export default {
		name: 'BackStage',
		computed: {
			salesTicket() {
				return this.$store.state.salesTicket
			},
			sumTicket(){
				return this.$store.state.sumTicket
			}
		}
	}
</script>

<style>
</style>

2.3、窗口组件Window

<template>
	<div class="cen">
		<h2>窗口{{num}}</h2>
		<h3>卖出总票数:{{winTicket}}</h3>
		<button @click="clickAdd">卖票{{num}}</button>
	</div>
</template>

<script>
	export default {
		name: 'Window',
		props: ['num'],
		data() {
			return {
				winTicket: 0
			}
		},
		methods: {
			clickAdd() {
				// 点击事件触发后,将触发actions中add
				// 并将卖了几张票作为参数传入,
				// 如果actions中不做复杂逻辑处理,
				// 也可直接调用Mutations中的ADD
				// 例:this.$store.commit("ADD",this.num)
				this.$store.dispatch("add", this.num)
				this.winTicket += this.num
			}
		},
	}
</script>

<style scoped>
	.cen{
		text-align: center;
	}
</style>

2.4、Vuex的使用

在components同级目录中创建store/index.js文件

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

// 在各个组件中使用$store.dispatch('add',value)触发action中的函数
// 主要用于业务逻辑处理,与服务器通信或者获取数据验证等
const actions = {
	add(context, value) {
		console.log(context + value);
		context.commit("ADD", value)
	}
}

// Actions中触发此中函数,用于修改共享数据state,主要用于数据修改。
const mutations = {
	ADD(state, value) {
		console.log(state, value);
		state.salesTicket += value
	}
}

const state = {
	sumTicket: 100,
	salesTicket: 0
}
export default new Vuex.Store({
	actions,
	mutations,
	state
})

3、mapState、mapGetters、mapActions、mapMutations的使用

3.1、mapState使用

使用mapState等可以让我们快速的生成计算属性,使用前需要在前引用
import {mapState} from 'vuex'
例:上面案例BackStage

// 原本写法
computed: {
	salesTicket() {
		return this.$store.state.salesTicket
	},
	sumTicket(){
		return this.$store.state.sumTicket
	}
}
// 简写方法
computed: {
	// 数组写法
	...mapState(['salesTicket','sumTicket'])
	// 对象写法
	...mapState({salesTicket:'salesTicket',sumTicket:'sumTicket'})
}

3.2、mapGetters使用

import {mapGetters} from 'vuex'
例:

// 原本写法
computed: {
	variable1() {
		return this.$store.getters.variable1
	},
	variable2(){
		return this.$store.getters.variable2
	}
}
// 简写方法
// 数组写法
...mapGetters(['variable1','variable2'])
// 对象写法同上

3.3、mapActions使用

例:

// 原本写法
<button @click="clickEvent">点击</button>
methods:{
	clickEvent(){
		this.$store.dispatch('action-name',参数)
	}
}

// 简写方法,简写方法需要在调用时传入参数
<button @click="clickEvent(参数)">点击</button>
methods:{
	// 对象写法
	...mapAction({clickEvent:'action-name'})
	// 数组写法,这种写法函数名也是action-name
	// 调用时需和action-name保持一致
	...mapAction(['action-name'])
}

3.4、mapMutations使用

例:

// 原本写法
<button @click="clickEvent">点击</button>
methods:{
	clickEvent(){
		this.$store.commit('Mutation-name',参数)
	}
}

// 简写方法
<button @click="clickEvent(参数)">点击</button>
methods:{
	// 对象写法
	...mapAction({clickEvent:'Mutations-name'})
	// 数组写法,这种写法函数名也是Mutations-name,
	// 调用时需和Mutations-name保持一致
	...mapAction(['Mutations-name'])
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值