美文网首页
Mutation不能使用异步函数

Mutation不能使用异步函数

作者: ZH彪 | 来源:发表于2021-12-10 18:18 被阅读0次

为什么必须是同步更新?
因为在开发过程中,我们常常会追踪状态的变化。常用的手段就是在浏览器控制台中调试。而在 mutation 中使用异步更新状态,虽然也会使状态正常更新,但是会导致开发者工具有时无法追踪到状态的变化,调试起来就会很困难。

index.js
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)
const state = { count: 0}

const mutations = {
  synchronization (state, params) {
    state.count += params.num
  },
  asynchronous (state, params) {
    setTimeout(() => {
      state.count += params.num
    }, 3000)
  }
}
export default new Vuex.Store({state,mutations})
<template>
  <div class="content">
    <h3>测试在mutations使用同步和异步</h3>
    <button @click="sync">同步</button>
    <button @click="async">异步</button>
    <p style="font-size: 30px;">这是vuex中的 <span style="color:red">{{ $store.state.count }}</span></p>
  </div>
</template>

export default {
  methods: {
    sync () {
      this.$store.commit({
        type: 'synchronization',
        num: 20
      })
    },
    async () {
      this.$store.commit({
        type: 'asynchronous',
        num: 20
      })
    }
  }
}

我们来看Devtools的Vuex状态图

一、点击同步 (在mutations里面做同步操作)

点击5次,点击时间线可以看到5次的点击每次都是增加20,页面中的count会随着点击变化而变化20>40>60>80>100

第1次:

image.png

第2次:

image.png
... ...

第5次:

image.png

二、点击异步 (在mutations里面做异步操作)

1、在3s内点击异步按钮5次,因为异步操作未完成,所以在时间线里面可以看到点击的这5次count都是0。页面中的count不会随着点击变化而变化,而是在3s后计算总和100


image.png

2、在3s后点击异步按钮1次(第六次点击),时间线上的count为前五次的总和100,而页面且为6次点击的总和120


image.png

总结

可以看到在Mutation中使用异步和同步最终页面的总和都是正确的,也就是说在Mutation中使用异步不会对数据造成丢失和其他影响。然而我们注意Vue Devtools显示结果,当我们去查看多次Mutation状态时,发现同步的显示Ok,异步的Count显示为0 和我们预期结果不一致,所以会造成状态改变的不可追踪,所以官方说我们Mutation是同步的!

重点事情
造成状态改变的不可追踪
造成状态改变的不可追踪
造成状态改变的不可追踪

在actions中就不会出现这种状态改变不可追踪的情况

相关文章

  • Mutation不能使用异步函数,为什么?

    Mutation不能使用异步函数 之前没有太深入研究,只是知道官方文档说不能异步调用Mutation,当初已为异步...

  • Mutation不能使用异步函数

    为什么必须是同步更新?因为在开发过程中,我们常常会追踪状态的变化。常用的手段就是在浏览器控制台中调试。而在 mut...

  • Vuex之action

    一般开发使用mutation已经足够,不过官网推荐mutation不要有异步操作,那么为了规范,我们应该把异步操作...

  • vue全家桶(4.3)

    5.3.Vuex的核心概念 #5.3.1.Mutation 注意; 在Mutation中,是不能提交异步代码的,例...

  • action和mutation区别

    action中处理异步,mutation不可以mutation做原子操作action可以整合多个mutation的...

  • Mutation和Action的区别

    Mutation中是同步函数和Action中是异步函数,属于一种约定,为了更好的追踪vuex的状态变化,希望我们都...

  • Vuex结合Axios异步请求数据的封装

    首先, 概括下 vuex基本使用流程为: 在action中分发异步请求, 在异步回调中提交mutation,在mu...

  • vuex-Action

    在 mutation 中混合异步调用会导致你的程序很难调试。例如,当你调用了两个包含异步回调的 mutation ...

  • 为什么 Vuex的mutation中不能做异步操作

    Vuex中状态更新的途径是mutation,异步操作通过 Action 来提交 mutation实现,这样使得我们...

  • Vuex-mutation

    mutation是唯一修改state值的入口mutation是一个函数,使用方法类似于自定义事件可以通过$stor...

网友评论

      本文标题:Mutation不能使用异步函数

      本文链接:https://www.haomeiwen.com/subject/xsrcfrtx.html