vuex的Mutations及mapMutations传参(mutations&actions)

状态管理模式
vuex的完整组成部分包括了state、getters、mutations以及actions。在组件内通过dispatch触发Actions中定义的方法,该方法通过commit一个mutations更改state,state的值会响应式的更新到vue组件中。如果是同步请求,可以直接在vue组件内commit一个mutations,如果有异步请求,则按着官网给的顺序图执行。
在这里插入图片描述

1.Mutations

index.js

import Vue from 'vue'
import Vuex from 'vuex'
import state from './app/state'
import getters from './app/getters'
import mutations from './app/mutations'
import actions from './app/actions'
import user from './user/user'

Vue.use(Vuex)

export default new Vuex.Store({
    state,
    getters,
    mutations,
    actions,
    modules: {
        user
    }
})

mutations.js

const mutations = {
    UPDATE_APP_NAME(state, params) {
        state.appName = params.newAppName;
    }
};
export default mutations;

在mutations中注册的方法参数肯定包括state,这里的state是跟此mutations同级的state,通过这个state参数可以访问到跟mutations同级下的state数据,从而达到修改state的需求。

index.vue

import { mapMutations } from 'vuex';
export default {
	methods: {
		// 方式一
		oneMethod() {
			this.$store.commit('UPDATE_APP_NAME', {
				newAppName: 'newAppName'
			})
		},
		// 方式二
		...mapMutations([
			'UPDATE_APP_NAME'
		]),
		twoMethod() {
			this.UPDATE_APP_NAME({
				newAppName: 'newAppName'
			});
		},
		// 方式三
		threeMethod() {
			this.$store.commit({
				type: 'UPDATE_APP_NAME',
				newAppName: 'newAppName'
			})
		}
	}
}

  1. 方式一是比较常见的一种方式this.$store.commit(value1,value2),其中包含了两个参数,参数value1是mutations中注册的方法名,value2是在mutations中注册的方法的第二个参数,可以是string、number等类型。
  2. 方式二是将vuex提供的工具方法mapMutations引入,直接调用方法 this.UPDATE_APP_NAME将你需要的参数传入即可。
  3. 方式三跟方式一相差不大,方式三将参数名和需要的参数放到一个对象中,此对象包含type,type便是mutations中注册的方法名称。

2.Actions

actions.js

import {getAppName} from "../../api/AppApi";
const actions = {
    async updateAppName({ commit }, params) {
        try{
            const { code, info } = await getAppName(params);
            commit('UPDATE_APP_NAME', info)
        } catch (e) {
            console.log(e);
        }
    }
};
export default actions;

此处简单调用了一个模拟接口getAppName

AppApi.js

export const getAppName = (params) => {
    return new Promise((resolve, reject) => {
        const err = null;
        setTimeout(() => {
            (!err) && resolve({code: 200, info: {newAppName: 'vuex-test'}}) || reject({code: 500, info: {newAppName: '发生错误了'}});
        })
    })
}

index.vue

import { mapActions } from 'vuex';
export default {
	methods: {
		// 方式一
		 ...mapActions([
                'updateAppName'
            ]),
         oneMethod() {
             this.updateAppName({
                  queryForm: '123'
             })
         },
         // 方式二
         twoMethod() {
           this.$store.dispatch('updateAppName', {
                  queryForm: '123'
           })
         },
         // 方式三
         threeMethods() {
			this.$store.dispatch({
                    type: 'updateAppName',
                    queryForm: '123'
            })
		}
	}
}

actions和mutations大同小异,方式一是通过工具方法mapActions,方式二比较常用,但方式一的写法更好一些。方式三同样是参数内包含了type属性。
本次的例子均未采用命名空间,所以actions和mutations直接调用就可以,因为getters、mutations和actions都是注册到全局的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值