首页前端开发VUEVuex unknown action type报错问题及解决

Vuex unknown action type报错问题及解决

时间2024-02-11 04:00:03发布访客分类VUE浏览870
导读:收集整理的这篇文章主要介绍了Vuex unknown action type报错问题及解决,觉得挺不错的,现在分享给大家,也给大家做个参考。 目录Vuex unknown action...
收集整理的这篇文章主要介绍了Vuex unknown action type报错问题及解决,觉得挺不错的,现在分享给大家,也给大家做个参考。
目录
  • Vuex unknown action type报错
  • vuex unknown action type:***
  • 总结

Vuex unknown action tyPE报错

在项目中使用到vuex,因为都是用的模块开发,目录如下

模块代码

原来使用代码

各种查找问题都不好使,完了再方法之前加上模块名称就ok了

vuex unknown action type:***

vuex 分模块后使用MapActions调用action老是提示 [vuex] unknown action type:*** 异常

目录

index.js是这样的

	import Vue From 'vue'	import Vuex from 'vuex'	import getters from './getters'		Vue.use(Vuex)		const modulesFiles = require.context('./modules', true, /\.js$/)		const modules = modulesFiles.keys().reduce((modules, modulePath) =>
 {
	  const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')	  const value = modulesFiles(modulePath)	  modules[moduleName] = value.default	  return modules	}
, {
}
)		const Store = new Vuex.Store({
	  modules,	  getters	}
    )		export default store

dataManage.js 模块定义是这样的

const state = {
  mId: '',  basicId: ''}
const mutations = {
  SET_MID(state, mId) {
    state.mId = mId  }
,  SET_BASIC_ID(state, basicId) {
    state.basicId = basicId  }
}
const actions = {
  setcachemid({
 commIT }
, mId) {
    console.LOG(mId)    commit('SET_MID', mId)  }
,  setBasicId({
 commit }
, basicId) {
    commit('SET_BASIC_ID', basicId)  }
}
export default {
  namespaced: true,  state,  mutations,  actions}
    

页面中调用时

import {
 mapActions }
 from 'vuex'   computed: {
    ...mapActions([      'setcachemid'    ]),    transfromPage(row, path) {
   		this.setcachemid(row.monitorId) // [vuex] unknown action type: setcachemid   }
 }
    

看dataManage.js并没什么错误呀!

纠结,

发现dispatch得使用这种才行

this.$store.dispatch('dataManage/setcachemid', row.monitorId)

看到这个是否明白了些什么!

最后调用代码改改

import {
 mapActions }
 from 'vuex'   computed: {
    ...mapActions({
      'cacc': 'dataManage/setcachemid'    }
),    transfromPage(row, path) {
   		  this.cacc(row.monitorId)   }
 }
    

ok问题解决,其实也是粗心开

index.js中模块加载modules[moduleName] = value.default 就知道

为根据模块名称为每个modules 加了一个key ,

访问当然也要到改对应的模块名下去找了

【纠错】

后来乘空闲去看了看源码,感觉上面最后一步的操作时错误的

他是允许在多模块时传入namespace参数来指定获取那个模块下的action 的

...mapActions({
      'cacc': 'dataManage/setcachemid'    }
    ),

之所以能成功,

关键在于这个normalizeMap

state的定义

在定义state 时将所有其子模块都通过getNestedstate绑定到了state 中上,然在dispatch时就可以通过对应的val 找到

看这个源码里的方法还是很绕的,还是不清楚,那么就搞个htML理一理

!DOCTYPE html>
    html>
    	head>
    		meta charset="utf-8">
    		title>
    理一理vue mapaction/title>
    	/head>
    	body>
    		script>
    			const mapActions = normalizeNamespace((namespace, actions) =>
 {
			  const res = {
}
			  normalizeMap(actions).foreach(({
 key, val }
    ) =>
 {
			    res[key] = function mappedAction (...args) {
					// 这里val 不为function 应该会执行dispatch.apply(this.$store, [val].concat(args))					// 这里就不模仿了,直接将concat值返回					//return typeof val === 'function'					// ? val.apply(this, [dispatch].concat(args))					// : dispatch.apply(this.$store, [val].concat(args))			      return [val].concat(args)			    }
			  }
)			  return res			}
)			/**			 * @param {
Object}
     fn			 * 此似高阶函数用法			 * 他返回了一个匿名函数给调用者			 * 如 const mapActions 得到的其实就是这个里面return (namespace, map) =>
     这个匿名函数			 * 而在定义 const mapActions = normalizeNamespace((namespace, actions) =>
 {
}
    ) 时又			 * 传入了一个匿名函数(namespace, actions) =>
 {
}
作为参数给normalizeNamespace这个方法,所以在			 * mapActions({
				  'cacc': 'dataManage/setcachemid'				}
    )				时; 其中执行的就是这个函数return返回的(namespace, map) =>
 {
}
这个匿名函数				然而这个匿名函数执行时内部又将mapActions定义是传入的fn执行并返回			 */			function normalizeNamespace (fn) {
    			  return (namespace, map) =>
 {
			    if (typeof namespace !== 'string') {
			      map = namespace			      namespace = ''			    }
 else if (namespace.charAt(namespace.length - 1) !== '/') {
			      namespace += '/'			    }
			    return fn(namespace, map)			  }
			}
    			/**			 * Normalize the map			 * normalizeMap([1, 2, 3]) =>
 [ {
 key: 1, val: 1 }
, {
 key: 2, val: 2 }
, {
 key: 3, val: 3 }
 ]			 * normalizeMap({
a: 1, b: 2, c: 3}
    ) =>
 [ {
 key: 'a', val: 1 }
, {
 key: 'b', val: 2 }
, {
 key: 'c', val: 3 }
 ]			 * @param {
Array|Object}
 map			 * @return {
Object}
			 */			function normalizeMap (map) {
    			  return Array.isArray(map)			    ? map.map(key =>
 ({
 key, val: key }
    ))			    : Object.keys(map).map(key =>
 ({
 key, val: map[key] }
))			}
						// 测试一哈			console.log(mapActions)						let resarr = mapActions({
			  'cacc': 'dataManage/setcachemid'			}
    )							console.log(resarr)			// 模仿执行handler 执行actions			console.log(resarr.cacc())		/script>
    	/body>
    /html>
    

F12查看打印如下:

好了转半天应该稍微理解一些了

而最终正确写法应该是

    ...mapActions('dataManage', {
      'cacc': 'setcachemid'    }
    ),

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

您可能感兴趣的文章:
  • 在使用vuex的时候出现commit未定义错误的解决
  • Vue常见报错整理大全(从此报错不害怕)
  • 浅谈Vuex注入Vue生命周期的过程

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: Vuex unknown action type报错问题及解决
本文地址: https://pptw.com/jishu/609291.html
Vue实现网页首屏加载动画及页面内请求数据加载loading效果 antd upload上传组件如何获取服务端返回数据

游客 回复需填写必要信息