vuex的高级应用

1 篇文章 0 订阅

平时使用vuex都是一些基本的使用`(this.$store.state, this.$store.commit(), this.、$store.dispatch(),今天添加了一些更高级的应用

//调用案例
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
	state: {
		test: 'vuex测试状态',
		price: 80
	},
	mutations: {
//vue建议我们mutations里面的最好用大写常量表示
		TESTCHANGE (state, payLoad){
			state.test = payLoad
		}
	},
	getters: {
		priceType(state) {
			return '¥' + state.price.toFixed(2)
		}
	},
	actions: {
//这里的context表示上下文,为一个对象,可以进行调用context.commit调用mutations从未改变state的数据(更好的方法可以使用解构赋值{commit})
	     asyncOperation(context) {
                   setTimeout('异步操作'1000)
}
	},
	modules: {
		demoa
	}
})

//更好的方法是单独存放在一个文件夹(此处只是为了展示)
const demoa = {
	namespaced: true,
	state: {
		demoatest: 'test'
	},
	mutations: {
		DEMATEXTCHANGE(state) {
			state.demoatest = 'changeDate'
		}
	}
}
state(放入计算属性)

频繁调用this.$store.state实在不是明智之举,试着把它放进计算属性

//首先需要引入vuex自带的api:mapState
import {mapState} from 'vuex'
//其次在计算属性里面使用api
computed: {
	...mapState(['test'])
},
//最后可以直接在页面里使用该数据
<template>
	<div>
		{{test}}  //显示vuex测试状态
	</div>
</template>
getters(vuex的计算属性)

当然不仅仅只有vue实例才有计算属性,vuex里面的getters也相当于计算属性,并且也可以放进vue实例里面的计算属性进行使用

//首先跟state的用法一致,首先需要引入vuex自带的api:mapGetters
import {mapGetters} from 'vuex'
//其次在计算属性里面使用api
computed: {
    ...mapGetters(['priceType'])
},
//最后可以直接在页面里使用该数据
<template>
	<div>
		{{priceType}}  //显示vuex测试状态
	</div>
</template>

####mutations
改变状态的唯一方法应该就是mutations了,但是每次使用都需要this.$store.commit(方法名,参数),vuex里面自带了api:mapMutations可以让我们将mutations的方法映射到methods方法里

//首先需要引入vuex自带的api:mapMutations
import {mapMutations} from 'vuex'
//其次在methods里面引入api
methods: {
...mapMutations(['testChange'])
//然后创建自己的方法进行调用
testChangeFun() {
    this.testChange('参数')
    }
}

actions(执行异步操作)

基础使用时this.$store,dispatch(),但是vuex提供了mapActions这样一个api,可以让我们更加便捷操作actions

//首先跟state的用法一致,首先需要引入vuex自带的api:mapActions
import {mapActions} from 'vuex'
//其次在计算属性里面使用api
methods: {
    ...mapActions(['asyncOperation'])
  //然后创建自己的方法进行调用
 asyncOperationFun() {
    this.asyncOperation('参数')
    }
}
modules

当项目非常庞大,每个页面的数据,异步请求等数据非常多时,便于管理,我们可使用modules来进行模块化管理

//使用时,要加模块对象里添加namespaced: true,表示限定命名空间
modules: {
    demoa//es6省略式语法
}
//模块注册成功后就可以进行使用了
//使用demoa模块里的state数据
//this.$store.state + 模块名 + 状态名
this.$store.state.demoa.demoatest
//使用demoa模块里的mutations方法
this.$store.commit('模块名 + / + mutations方法名')
this.$store.commit('demoa/DEMATEXTCHANGE')
//······
//当然,模块也可以使用vuex的api,只是需要在使用api时加入模块名即可
...mapState("demoa", ["demoatest"])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值