vuex action 与mutations 的区别

2018-06-24 23:02
椰子皮
3725
0
19
vue

事实上在 vuex 里面 actions 只是一个架构性的概念,并不是必须的,说到底只是一个函数,你在里面想干嘛都可以,只要</span>最后触发 mutation 就行。异步竞态怎么处理那是用户自己的事情。

事实上在 vuex 里面 actions 只是一个架构性的概念,并不是必须的,说到底只是一个函数,你在里面想干嘛都可以,只要</span>最后触发 mutation 就行。异步竞态怎么处理那是用户自己的事情。

Vuex.Store({
  state,
  actions,
  mutation
});

vuex 真正限制你的只有 mutation 必须是同步的这一点,在vue中,只有mutation才能正真改变VUEX stroe中的state

 

Action 提交的是 mutation,而不是直接变更状态。</span>

Action 可以包含任意异步操作。 个人觉得这个action的 产生就是 因为mutation 不能进行异步操作,如果有异步操作那么就用action 来提交mutation。

Mutation 必须是同步函数</span>

一条重要的原则就是要记住 mutation 必须是同步函数。为什么?请参考下面的例子:</span>

mutations: {
  someMutation (state) {
    api.callAsyncMethod(() => {
      state.count++
    })
  }
}

现在想象,我们正在 debug 一个 app 并且观察 devtool 中的 mutation 日志。每一条 mutation 被记录,devtools 都需要捕捉到前一状态和后一状态的快照。然而,在上面的例子中 mutation 中的异步函数中的回调让这不可能完成:因为当 mutation 触发的时候,回调函数还没有被调用,devtools 不知道什么时候回调函数实际上被调用——实质上任何在回调函数中进行的状态的改变都是不可追踪的</span>。</span>

 

在组件中提交 Mutation

你可以在组件中使用 this.$store.commit('xxx') 提交 mutation,或者使用 mapMutations 辅助函数将组件中的 methods 映射为 store.commit 调用(需要在根节点注入 store)

import { mapMutations } from 'vuex'

export default {
  // ...
  methods: {
    ...mapMutations([
      'increment', // 将&nbsp;`this.increment()` 映射为&nbsp;`this.$store.commit('increment')`

      // `mapMutations` 也支持载荷:
      'incrementBy' // 将&nbsp;`this.incrementBy(amount)` 映射为&nbsp;`this.$store.commit('incrementBy', amount)`
    ]),
    ...mapMutations({
      add: 'increment' // 将&nbsp;`this.add()` 映射为&nbsp;`this.$store.commit('increment')`
    })
  }
}

如果想要获取对应的状态你就可以直接使用this.$store.state获取,当然,也可以利用vuex提供的mapState辅助函数将state映射到计算属性中去,如.

const store = new Vuex.Store({ state: { count: 1 }, mutations: { increment (state) { // 变更状态&nbsp;state.count++ } } })

Action去comit一个mutation。它要指定去commit哪一个mutation,然后指定结束之后要做什么什么事情就要给出一个函数,所以说mutation的构成有两点名称和函数

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  },
  actions: {
    increment (context) {
      context.commit('increment')
    }
  }
})

action 异步操作

actions: {
  incrementAsync ({ commit }) {
    setTimeout(() => {
      commit('increment')
    }, 1000)
  }
}
支付宝微信
19
关注公众号获取更多内容
weex中使用promise封装一个网络请求
结合lazyload实现文章页里面的图片预加载
暂无评论,快抢沙发吧
不支持canvas
春季
夏季
秋季
冬季
暗黑
简约
小清新