vuex中store存储store.commit和store.dispatch的区别及用法

参考:​​​​vuex中store存储store.commit和store.dispatch的区别及用法 - Amerys - 博客园
参考:​​​​

代码演示: 

  首先,我们假设state有以下数据

//类似组件data, 定义组件公共数据 
 state: {

    book: 'jQuery',

  },

  然后我们要在组价中修改book, 现在mutations中定义修改的方法

  //类似组件methods, 定义修改state的方法
  mutations: {

    modifyBook(state, data) {
       // 当有提交载荷的时候就修改传入的值,否则默认修改为React
        state.book = data || 'React'; 
    }

  },

   组件中调用 ,提醒: mutations 和 actions 都要在组件的methods中使用 ,而state和getters都是在组件中的computed中使用

 methods: {

    //提交modifyBook修改state的book
    modifyBook() {
      this.$store.commit('modifyBook');
    },

    
   /*
     等价于
     使用辅助函数 mapMutations
     ...mapMutations(['modifyBook']),
    */

}

   此时定义完成后就可以使用modifyBook方法进行修改state中book的值了。

   那么问题来了,那我修改完想做其他事情怎么办呢?

   这就要用到 dispatch 来做好一些了。接着往下看!

   首先我们知道使用dispatch是在actions中使用的,所以我们要在actions中定义提交mutations的方法

actions: {

    actions1 ({commit}, data) {
        {commit} 等价于 context.commit

        //提交mutations的modifyBook
        (modifyBook   ==>  名称要跟mutations中定义的一模一样)
        commit('modifyBook', data);
    }

}         

      解答上面为什么写成{commit}?

// 例

 actions: {
    ac1(context, data) {
      console.log('context ==> ', context);

      //context: 对象
      //context.commit: 用来提交当前模块的mutations
      //context.dispatch: 用来提交当前模块的actions
      //context.state: 用于操作当前模块的state
      //context.getters: 用于操作当前模块的getters
      //context.rootState: 用于操作全局的state
      //context.rootGetters: 用于操作全局的getters

    
     // 因为context是个对象,所以我们可以使用es6的解构出commit,所以写成{commit}
    },
}    

      回到组件中的methods

 methods: {

    //提交modifyBook修改state的book
    modifyBook() {
      this.$store.commit('modifyBook');
    },

    
   /*
     等价于
     使用辅助函数 mapMutations
     ...mapMutations(['modifyBook']),
    */


     //通过actions提交mutations修改state
    action1() {
      //提交actions并且携带一个参数后,返回一个promise, 就可以执行异步操作
      this.$store.dispatch('action1', 'Bootstrap').then(() => {
        console.log('我被执行了!');
      });
    },


     // 结果: 把state中book原本的值jQuery修改为了Bootstrap,并在控制台输出了我被执行了!
}

   到此我们就可以知道 dispatch 在执行了mutations之后还可以做其他事情,比如进行本地存储的一些其他操作。

   上述我们可以得出两者的相同之处和区别:

      1、commit 和 dispatch 两个方法都是传值给vuex的mutation改变state

      2、区别总的来说他们只是存取方式的不同    

         // commit: 用来提交当前模块的mutations 

              // dispatch: 用来提交当前模块的actions(actions可以提交mutations,可以进行异步操作)  

           // commit 有些做不到的可以用 dispatch 进行提交

      3、 mutations修改state, action提交mutations。但是如果修改完还想做其他事情就用actions比较方便(then后执行想要做的事情) ==> this.$store.dispatch().then()

      4、同步和异步之别

            commit: 同步操作

            存储 this.$store.commit('changeValue',name)

            取值 this.$store.state.changeValue

    

            dispatch: 异步操作

            存储 this.$store.dispatch('getlists',name)

            取值 this.$store.getters.getlists

Vuex,`this.store.dispatch()` 是用于向应用的状态树(state tree)执行一个异步或同步的action的方法。Vuex是Vue.js官方推荐的状态管理模式,它帮助我们管理单个应用的共享状态。 当你调用 `this.store.dispatch(actionName, [payload])` 时,做了以下几个事情: 1. **Action 名称(actionName)**:这是你要触发的action的名称,它是一个字符串。Action是一组可复用的操作,它们通常定义在`store/modules`,每个模块都有自己的actions。 2. **Payload(可选)**:这是一个可选的数据对象,你可以传递给action的参数,action可以操作这些数据并返回一个值。 - **异步调用**:如果action包含了`async`关键字,那么dispatch会返回一个Promise,你可以使用`.then()`、`.catch()`等方式处理action的结果。这使得你可以在action完成时更新状态,并在必要时通知到视图层。 - **同步调用**:如果action没有`async`,它将立即执行并返回结果,然后你可以直接操作返回的值。 - **分发过程**:`dispatch`会自动处理action的上下文(context),确保你在action内部可以访问`store`实例以及相关的辅助方法,如`commit()`(用于修改状态)和` getters`(用于读取状态)。 相关问题: 1. 在Vuex,action通常如何组织和管理? 2. 如何在action处理成功和失败的情况? 3. 在action执行时,为什么要使用`commit`而不是直接修改状态?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值