vue笔记之Mutation 辅助函数以及载荷的应用

已被阅读 1332 次 | 文章分类:VUE | 2018-11-08 23:42

Mutation在上一节中有过简单介绍,主要用来改变状态值,调用Mutation中的函数需要使用注册函数,本节了解Mutation的相关应用,辅助函数的使用,以及如何应用载荷

二:载荷

1.定义方式,一看即明白,state默认是第一个参数,第二个参数就是载荷

                                            
Mutation{
    incrementpayload (state,payload){
         state.count+=payload.amount;
    }
}
      
                                            
                                        

看出载荷有什么用了吗?在上一节只能对state进行自改变,现在可以传入载荷值,改变状态会更加有弹性

2.调用方式,作为一个参数,载荷可以是一个值也可以是一个对象,赞成使用对象;对象中可以定义各种值

                                            
// 带有载荷的mutation函数调用方式

// 调用方式一 
store.commit('incrementpayload',{
  amount:10
});

// 调用方式二  
store.commit({
    type:'incrementpayload',
    amount:20
});
                                            
                                        

3.在所有组件中调用,如何在组件中获取到store的全局Mutation呢

                                            
// 通过this.$store来找到store

// 调用方式
this.$store.commit('incrementpayload',{
    amount:20
});
                                            
                                        

在这里提出一个问题如下,如果一个组件中要commit很多个Mutation函数呢,会出现如下情况

                                            
this.$store.commit('increment0')
this.$store.commit('increment1')
this.$store.commit('increment2')
this.$store.commit('increment3')
this.$store.commit('incrementpayload',{
    amount:10
});
this.$store.commit('incrementpayload',{
    amount:20
});
                                            
                                        

所以VUE提出了一个解决方案,辅助函数mapMutations,只是通过它来简写调用方式;下面详解

三:使用mapMutations

1.在组件中使用mapMutations,原理是简化过长的this.$store.commit

2.在main.js中定义了两个mutation方法,一个带载荷,一个不带,increment和increment1

                                            
const store = new Vuex.Store({
  state: {
    count: 2
  },
  mutations: {
    increment (state) {
      state.count++
    },
    increment1 (state,payload){
      state.count+=payload.amount;
    }
  }
})
                                            
                                        

3. 在子组件child1中使用一个辅助函数,定义的方式有如下两种

                                            
methods:{
    ...mapMutations([    
        'increment',        // 方式一  直接使用以前的mutation函数名
        'increment1'
    ]),
    ...mapMutations({
        add: 'increment'   //  方式二 定义一个别名
    }),
    count(){
        this.$store.commit(‘increment1’,{
            amount:20
        });
   }
}
            
                                            
                                        

4. 调用经过辅助函数映射过的mutation函数;和调用普通函数一样的

                                            
this.increment();   // 不带载荷
this.increment1({amount:20});  //带载荷
this.add({amount:20});   // 别名的方式
this.count(); //调用普通函数
                                            
                                        

刚开始不理解不要紧,只有知道辅助函数顾名思义就是辅助代码编写,让代码维护更加便捷,编写更加方便

四:使用常量替代mutation函数名

1. 上面的辅助函数,使得注册mutation函数很方便,这里再介绍一个更加方便的技术,其实就是让我们的方法名可以动态改变;这在较大的项目中应用比较方便;一般项目可以不用

2. 基本思路,定义一个常量;然后定义和调用mutation函数的时候使用

                                            
// mutation-types.js   定义常量的地方
var types={
    mutationFn1:'increment1',
    mutationFn2:'increment2',
    mutationFn3:'increment3'
}
export default types

// main.js           定义mutation的时候使用常量计算属性作为函数名
import types from './mutation-types'
const store = new Vuex.Store({
  state: {
    count: 2
  },
  mutations: { 
    [types.mutationFn1] (state) {
      state.count--
    },
    [types.mutationFn2] (state) {
      state.count++
    },
    [types.mutationFn3](state,payload){
      state.count+=payload.amount;
    } 
  }
})

// 在组件child1 中使用
import types from './mutation-types'
methods:{    
    ...mapMutations({
        add:[types.mutationFn1],
        delete:[types.mutationFn2],
        show:[types.mutationFn3]
    }),
    count(){
     return this.$store.state.count 
    }
}
                                            
                                        

这样设计的好处,如果以后要更改全局mutation的某一个函数名,只需要变更对应常量值即可

QQ:3410192267 | 技术支持 微信:popstarqqsmall

Copyright ©2017 xiaobaigis.com . 版权所有 鲁ICP备17027716号