在useEffect中调用Redux的dispatch时报Cannot read 'type'错误如何解决?
问题根因
你导入setProjects action的方式错误。你的slice文件中setProjects是命名导出,但你在Home组件中用了默认导入的语法,导致实际拿到的setProjects是slice导出的reducer函数,不是action creator。调用它生成的内容不符合Redux action的格式(缺少type字段),所以dispatch时抛出你看到的类型错误。
修复方案
- 修正Home组件中
setProjects的导入语句,改为命名导入:
// 把原来的默认导入改为花括号包裹的命名导入 import { setProjects } from '../features/projects/projectSlice'
- 可选优化(避免潜在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
相关产品推荐
相关产品推荐

