ReactJS中Reducer接收参数但无响应,删除评论功能失效求助
排查Redux Reducer删除评论无效果的问题
从你提供的代码来看,我发现几个可能导致状态不更新、评论无法删除的关键点,咱们逐一排查:
1. Reducer中引用了未定义的comments变量
你的Reducer代码里这一行存在明显问题:
case action.DELETE_COMMENT: return { ...state , comments : comments.filter((item : any) => item.commentid !== action.id) }
这里的comments.filter中的comments并没有从当前传入的state中获取,应该改为state.comments.filter——Reducer的状态更新必须基于当前的state对象。正确的写法应该是:
case action.DELETE_COMMENT: return { ...state, comments: state.comments.filter((item: any) => item.commentid !== action.id) }
如果直接写comments,它会指向外部作用域的变量(如果存在的话),而非当前state的comments数组,导致返回的新状态里comments没有正确更新。
2. 检查ID的类型匹配问题
你提到已经确认ID传递正常,但要注意类型是否一致:
- 后端返回的
item.commentid可能是字符串类型(比如数据库存储的ID是字符串) - 而你的
deleteComment函数接收的参数标注为id: Number,传递给action后变成数字类型
这时候item.commentid !== action.id会因为类型不相等而返回true,导致过滤不掉目标评论。
解决方法是统一类型后再比较:
// 在Reducer里统一转为字符串比较 item.commentid.toString() !== action.id.toString() // 或者在传递ID时就统一类型 const deleteComment = (id: any) => { dispatch(actions.deleteComment(id.toString())) }
3. 确认Action类型常量的一致性
检查你的action.DELETE_COMMENT常量是否和定义的action creator中的类型完全一致,有没有拼写错误(比如大小写、单词拼写)。如果类型不匹配,Reducer根本不会进入这个case分支,自然不会更新状态。
4. 验证Redux DevTools中的Action Payload
在Redux DevTools中查看触发DELETE_COMMENT action时的payload(也就是action.id)是否和要删除的评论的commentid完全一致。有时候可能因为传递过程中ID被意外修改,导致匹配失败。
按照这几个步骤排查后,应该就能解决状态不更新、评论无法删除的问题了。
内容的提问来源于stack exchange,提问作者Nika Roffy
相关产品推荐
相关产品推荐

