Vuex调用命名空间模块action报unknown action type错误求助
问题原因
- 核心报错原因:你的
bookingFunnel模块开启了namespaced: true命名空间配置,该模块下所有的action、mutation、getter在全局调用时都需要加上模块名作为前缀,你直接调用this.$store.dispatch('updateVehicleId', id)时,Vuex会在根store下查找名为updateVehicleId的action,自然找不到。 - 隐藏逻辑问题:你定义的
updateVehicleIdaction不符合Vuex规范:- action的第一个参数是context对象(包含commit、state、dispatch等属性),你将其命名为
state容易产生混淆 - 不允许在action中直接修改state属性,必须调用commit触发对应的mutation完成state修改
- 你直接赋值的
vehicle_id字段和state中定义的vehicleId字段名不匹配,就算跳过规范直接修改也不会生效
- action的第一个参数是context对象(包含commit、state、dispatch等属性),你将其命名为
- 额外可优化问题:getters中定义的
getApiUrl对应的state.apiUrl没有在state中声明,调用时会返回undefined。
解决方法
方式一:修正dispatch调用路径,同时修正action逻辑
首先修改bookingFunnel模块的action代码:
actions: { // 把参数名从state改为context避免混淆,也可以直接解构取commit和state toggleVisible({ commit, state }) { commit('toggle', !state.visible); }, updateVehicleId({ commit }, payload) { // 调用已定义的setVehicleId mutation修改state commit('setVehicleId', payload); } }
之后调用dispatch时加上模块前缀即可:
this.$store.dispatch('bookingFunnel/updateVehicleId', id)
方式二:直接使用已映射的实例方法
你已经在Vue实例的methods中通过mapActions把bookingFunnel/updateVehicleId映射为当前实例的updateVehicleId方法,无需手动调用$store.dispatch,直接调用即可:
this.updateVehicleId(id)
内容的提问来源于stack exchange,提问作者Graham Morby
相关产品推荐
相关产品推荐

