美文网首页
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不能使用异步函数

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