You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在useEffect中调用Redux的dispatch时报Cannot read 'type'错误如何解决?

问题根因

你导入setProjects action的方式错误。你的slice文件中setProjects是命名导出,但你在Home组件中用了默认导入的语法,导致实际拿到的setProjects是slice导出的reducer函数,不是action creator。调用它生成的内容不符合Redux action的格式(缺少type字段),所以dispatch时抛出你看到的类型错误。


修复方案

  1. 修正Home组件中setProjects的导入语句,改为命名导入:
// 把原来的默认导入改为花括号包裹的命名导入
import { setProjects } from '../features/projects/projectSlice'
  1. 可选优化(避免潜在bug):
  • 每次snapshot触发时重置projects数组,避免多次触发重复累加旧数据
  • 遍历文档用forEach更合适,map是用来生成新数组的方法
  • 组件卸载时取消firebase监听,避免内存泄漏
    修改后的useEffect参考:
useEffect(() => {
    const unsubscribe = db.collection('projects').onSnapshot((snapshot) => {
        // 每次快照更新先重置数组,避免数据重复
        let projects = [];
        snapshot.docs.forEach((doc) => {
            const data = doc.data();
            // 提前判空避免type不存在的潜在报错
            if(data?.type === 'clone') {
                projects.push({ id: doc.id, ...data });
            }
        });
        dispatch(setProjects({
            project : projects,
        }))
    });
    // 组件卸载时取消监听
    return () => unsubscribe();
}, [dispatch]);

内容的提问来源于stack exchange,提问作者Dev AD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 01:48:01