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

作者分享了在使用Vuex进行模块化开发时遇到的问题,包括未正确命名空间和actions的使用。通过调整代码结构和启用命名空间,成功解决了dispatch时的未知actionType错误,并提供了排查和解决方案。
摘要由CSDN通过智能技术生成

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

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

 src/store/index.js

import {createStore} from 'vuex';
// 引入小仓库
import home from '@/store/home/index'
import search from '@/store/search/index'


// 对外暴露store类的一个实例
export default createStore({
    // 实现vuex仓库模块式开发存储数据
    modules:{
        home,
        search,
    }
});

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

// home模块的小仓库
import {createStore} from 'vuex';
import {reqCategoryList} from '@/api';

const state = {
    categoryList:[],
};
const mutations = {
    CATEGORYLIST(state,categoryList){
        state.categoryList = categoryList;
    },
};
const actions = {
    // 通过API里面的接口函数调用,向服务器发请求,获取服务器的数据
    async categoryList({commit}){
        console.log('123');
        let result = await reqCategoryList();
        if(result.code == 200){
            commit("CATEGORYLIST",result.data);
        }
    }
};
const getters = {};

export default createStore({
    namespaced: true,
    state,
    mutations,
    actions,
    getters
});

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

<script>
import { useStore } from "vuex";
import { onMounted } from "vue";

export default {
  name: "TypeNav",
  setup() {
    const store = useStore();
    // 组件挂载完毕,可以向服务器发请求
    onMounted(() => {
      // 通知vuex发请求,获取数据,存储于仓库中
      store.dispatch("home/categoryList");
      // console.log(store);
    });
  },
};
</script>

结果,它就报错了。

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

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

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

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

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

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

// home模块的小仓库
import {reqCategoryList} from '@/api';

const home = {
    state: {
        categoryList:[],
    },
    mutations: {
        CATEGORYLIST(state,categoryList){
            state.categoryList = categoryList;
        },
    },
    actions: {
        // 通过API里面的接口函数调用,向服务器发请求,获取服务器的数据
        async categoryList({commit}){
            let result = await reqCategoryList();
            console.log(result);
            if(result.code == 200){
                commit("CATEGORYLIST",result.data);
            }
        }
    },
    getters: {},
}
export default home;

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

export default {
  name: "TypeNav",
  setup() {
    const store = useStore();
    // 组件挂载完毕,可以向服务器发请求
    onMounted(() => {
      console.log(store.state);
      // 通知vuex发请求,获取数据,存储于仓库中
      store.dispatch("categoryList");
      console.log(store);
    });
  },
};
</script>

然后就ok了!

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

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

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

解释代码:<script> import navBar from '@/components/NavBar' import swiper from '@/components/Swiper' import { getHome } from '../service/home' import { getUserInfo } from '../service/user' import { getLocal } from '@/common/js/utils' import { Toast } from 'vant' import axios from '../utils/axios' export default { name: 'home', data() { return { swiperList: [], isLogin: false, headerScroll: false, hots: [], newGoodses: [], recommends: [], categoryList: [ { name: '楼楼交友', imgUrl: '//s.yezgea02.com/1598679532890/jiaoyou.png', categoryId: 100001 }, { name: '楼楼家政', imgUrl: '//s.yezgea02.com/1598679532890/jiazheng.png', categoryId: 100003 }, { name: '楼楼水产', imgUrl: '//s.yezgea02.com/1598679734813/shuichan1.png', categoryId: 100002 }, { name: '楼楼租车', imgUrl: '//s.yezgea02.com/1598679532890/zuche.png', categoryId: 100004 }, { name: '楼楼招聘', imgUrl: '//s.yezgea02.com/1598679792590/pin.png', categoryId: 100005 }, { name: '楼楼二手', imgUrl: '//s.yezgea02.com/1598679853415/ershou.png', categoryId: 100006 }, { name: '楼楼宠物', imgUrl: '//s.yezgea02.com/1598679532890/chongwu.png', categoryId: 100007 }, { name: '楼楼外卖', imgUrl: '//s.yezgea02.com/1598679905787/wm.png', categoryId: 100008 }, { name: '楼楼电器', imgUrl: '//s.yezgea02.com/1598680199443/dianqi.png', categoryId: 100009 }, { name: '楼楼充值', imgUrl: '//s.yezgea02.com/1598680264015/czcz.png', categoryId: 1000010 } ], } }, components: { navBar, swiper }, async mounted() { const token = getLocal('token') if (token) { this.isLogin = true } window.addEventListener('scroll', this.pageScroll) Toast.loading({ message: '加载中...', forbidClick: true }); const { data } = await getHome() this.swiperList = data.carousels this.newGoodses = data.newGoodses this.hots = data.hotGoodses this.recommends = data.recommendGoodses Toast.clear() }, methods: { pageScroll() { let scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop scrollTop > 100 ? this.headerScroll = true : this.headerScroll = false }, goToDetail(item) { this.$router.push({ path: `product/${item.goodsId}` }) } } } </script>
03-07
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值