Vuex中无法分发不提交Mutation的Action?传入参数异常
问题根因
完全是对Vuex Action的参数传递规则不熟悉导致的,和你用的mapActions配置、组件调用逻辑都没有关系。
Vuex Action 固定参数规则
框架执行Action时,会自动给函数传入第一个固定入参——即包含state、getters、rootGetters、dispatch、commit的store上下文对象,这个参数是框架自动注入的,不随你组件调用时传的业务参数变化。
当你在组件里执行this.repeatWord('test')时,实际传给Action函数的参数顺序是:
- 第1个位置:框架自动注入的store上下文
- 第2个位置:你传入的业务值'test'
你的代码错位点
你在store/actions.js里写的测试Action:
repeatWord(data) { console.log(data) }
这里把第一个位置自动注入的上下文对象赋值给了data,根本没有留位置接第二个参数'test',所以控制台自然会打印出那堆包含state、commit的对象,和你观察到的现象完全吻合。
正确的实现方式
按参数顺序定义接收值即可:
// store/actions.js repeatWord(context, payload) { // context 是框架自动注入的store上下文 // payload 才是你组件调用时传入的'test' console.log(payload) }
现象补充
你之前觉得“只有包含commit操作的Action才能正常运行”,本质是之前写带commit逻辑的Action时,下意识按规则把第一个参数留作接收context(用来调用context.commit),刚好匹配了框架的参数传递逻辑;这次写最简测试用例时,误把第一个参数位置当成了业务入参,才出现了参数错位的问题。你写的mapActions映射、组件调用代码本身没有任何问题。
注:如果不需要用到Action里的上下文方法,也可以把第一个参数留空,直接用第二个参数接业务值,但参数顺序不能乱。
内容的提问来源于stack exchange,提问作者Progressive
相关产品推荐
相关产品推荐

