• 【vuex】unknown action type:home/categoryList报错


    记录一下今天遇到的bug。在做项目时,想进行vuex模块化开发。

    在src/store下暂且建了两个小仓库home和search

     src/store/index.js

    1. import {createStore} from 'vuex';
    2. // 引入小仓库
    3. import home from '@/store/home/index'
    4. import search from '@/store/search/index'
    5. // 对外暴露store类的一个实例
    6. export default createStore({
    7. // 实现vuex仓库模块式开发存储数据
    8. modules:{
    9. home,
    10. search,
    11. }
    12. });

    其中src/store/home/index.js小仓库中的代码如下:

    1. // home模块的小仓库
    2. import {createStore} from 'vuex';
    3. import {reqCategoryList} from '@/api';
    4. const state = {
    5. categoryList:[],
    6. };
    7. const mutations = {
    8. CATEGORYLIST(state,categoryList){
    9. state.categoryList = categoryList;
    10. },
    11. };
    12. const actions = {
    13. // 通过API里面的接口函数调用,向服务器发请求,获取服务器的数据
    14. async categoryList({commit}){
    15. console.log('123');
    16. let result = await reqCategoryList();
    17. if(result.code == 200){
    18. commit("CATEGORYLIST",result.data);
    19. }
    20. }
    21. };
    22. const getters = {};
    23. export default createStore({
    24. namespaced: true,
    25. state,
    26. mutations,
    27. actions,
    28. getters
    29. });

    在我的Nav导航组件中进行值传递

    结果,它就报错了。

    于是就开始了艰难的找bug之路。

    一开始并没有开启命名空间,没有namespaced:true,dispatch时只是categoryList。也是unknown action type。所以我搜了一些帖子说是可以加命名空间(我不知道我这么加对不对)。但是没有用,还是报错。

    找了很多的帖子,但都不是很有用, 基本都是一摸一样的操作和说法。

    所以就去了官方文档查看。Module | Vuex

    文档中建议只需要对外暴露一个module对象即可,不需要用到createStore。

    所以我根据文档改了一下代码,src/store/home/index.js如下:

    1. // home模块的小仓库
    2. import {reqCategoryList} from '@/api';
    3. const home = {
    4. state: {
    5. categoryList:[],
    6. },
    7. mutations: {
    8. CATEGORYLIST(state,categoryList){
    9. state.categoryList = categoryList;
    10. },
    11. },
    12. actions: {
    13. // 通过API里面的接口函数调用,向服务器发请求,获取服务器的数据
    14. async categoryList({commit}){
    15. let result = await reqCategoryList();
    16. console.log(result);
    17. if(result.code == 200){
    18. commit("CATEGORYLIST",result.data);
    19. }
    20. }
    21. },
    22. getters: {},
    23. }
    24. export default home;

     并且我派遣的时候没再用命名空间,没加上home/

    1. export default {
    2. name: "TypeNav",
    3. setup() {
    4. const store = useStore();
    5. // 组件挂载完毕,可以向服务器发请求
    6. onMounted(() => {
    7. console.log(store.state);
    8. // 通知vuex发请求,获取数据,存储于仓库中
    9. store.dispatch("categoryList");
    10. console.log(store);
    11. });
    12. },
    13. };

    然后就ok了!

    我输出了module的state 以及 actions中获取的服务器数据

     如果有同样问题的,可以尝试用这种方法改,后续我再尝试一下要加命名空间的话要怎么写代码。

    如果有帮助的话,可以点赞收藏哟,感谢~

  • 相关阅读:
    c++运算符重载
    面试题:说一下 http 报文都有哪些东西?
    SpringBoot运维实用篇
    React (1)
    苯并吡喃腈衍生物
    Elasticsearch:崭新的打分机制 - Learning To Rank (LTR)
    ndk-c++
    Cygwin使用心得
    深入理解python虚拟机:程序执行的载体——栈帧
    Hive (十) --------- 企业级调优
  • 原文地址:https://blog.csdn.net/m0_56698268/article/details/126460933