Vuex - Mutation-Action

140 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

- mutations: 同步方法,更新数据的方法,

更改vuex中store中state状态的唯一方法就是提交mutation,就很类似事件。每个mutation都有一个字符串类型的事件类型和一个回调函数,我们需要改变state的值就要在回调函数中修改store中的状态进行改变。我们要执行这个回调函数,那么我们需要执行一个相应的调用方法store.commit

第一种方式

Mutation用于修改变更$store中的数据
 // 同步方法
    mutations: {
        inc(state,n){
            state.number += n
            // console.log(state.number) 
        }
    },
    
    
mutations: {
    add(state,step){
      //第一个形参永远都是state也就是$state对象
      //第二个形参是调用add时传递的参数
      state.count+=step;
    }
  }    
    

第二种方式

import { mapMutations } from 'vuex'

methods:{
  ...mapMutations(['add'])
}

import { mapState,mapMutations } from 'vuex'

export default {
  data() {
    return {}
  },
  methods:{
      //获得mapMutations映射的sub函数
      ...mapMutations(['sub']),
      //当点击按钮时触发Sub函数
      Sub(){
          //调用sub函数完成对数据的操作
          this.sub(10);
      }
  },
  computed:{
      ...mapState(['count'])
      
  }
}
  • commit方法,当方法执行的时候会通过commit来触mutations里面的方法进行数据的修改
  • mutations里面的每个函数都会有一个state参数,这样就可以在mutations里面进行state的数据修改,当数据修改完毕后,会传导给页面,页面的数据也会发生改变

注意, 在mutations中不能编写异步的代码,会导致vue调试器的显示出错。在vuex中我们可以使用Action来执行异步操作。

- actions: 异步方法,调用mutations 中的方法, 更新state 数据;

action类似于mutation,不同的是action可以提交mutation,在action中可以执行store.commit,而且action中可以有任何的异步操作。(不是直接变更状态,可以包含任意异步操作)在页面中如果我们要嗲用这个action,则需要执行store.dispatch

Action 函数接受一个与 store 实例具有相同方法和属性的 context 对象,因此你可以调用 context.commit 提交一个 mutation,或者通过 context.state 和 context.getters 来获取 state 和 getters。当我们在之后介绍到 Modules 时,你就知道 context 对象为什么不是 store 实例本身了。

第一种方式

// 异步方法
    actions: {
        AsyncIne({commit,state},n){
            console.log(n) 
            // this.$store.commit(),
            setInterval(()=>{
                commit('inc',20)
                console.log(state.number)
            },2000)
        }
    }

第二种方式

import { mapActions } from 'vuex'

methods:{
  ...mapMutations(['subAsync'])
}


import { mapState,mapMutations,mapActions } from 'vuex'

export default {
  data() {
    return {}
  },
  methods:{
      //获得mapMutations映射的sub函数
      ...mapMutations(['sub']),
      //当点击按钮时触发Sub函数
      Sub(){
          //调用sub函数完成对数据的操作
          this.sub(10);
      },
      //获得mapActions映射的addAsync函数
      ...mapActions(['subAsync']),
      asyncSub(){
          this.subAsync(5);
      }
  },
  computed:{
      ...mapState(['count'])
      
  }
}

Mutation和Action之间的区别是什么

流程顺序

“相应视图—>修改State”拆分成两部分,视图触发Action,Action再触发Mutation

角色定位

基于流程顺序,二者扮演不同的角色

  • Mutation:专注于修改State,理论上是修改State的唯一途径
  • Action:业务代码、异步请求 限制
  • 角色不同,二者有不同的限制
  • Mutation:必须同步执行
  • Action:可以异步,但不能直接操作State