React+Redux中Cannot read properties of undefined报错求助
问题解决:展示评论时出现"Cannot read properties of undefined (reading 'from')"错误
错误根源
错误出现在CommentSection组件的这段代码里:
posts.find(p => String(p.from.id) === comment.fromId).from.username
当posts.find(...)找不到匹配comment.fromId的帖子时,会返回undefined,此时直接访问undefined.from就会触发TypeError。
可能的诱因
- 数据加载时序问题:子组件中获取评论的
useEffect是空依赖,组件挂载就会立即执行,但此时posts数据可能还没通过dispatch(getPosts)加载完成,导致find返回undefined。 - 数据不匹配:评论的
fromId对应的帖子不存在于Redux store的posts列表中。 - 重复请求冲突:子组件和父组件都调用了
dispatch(getPosts(filter)),两次请求的返回顺序不确定,可能导致子组件渲染时posts数据还未更新。
解决方案
方案1:添加空值保护,避免直接访问未定义属性
修改评论渲染逻辑,先判断find的结果是否存在:
const commentDisplay = comment.map(comment => { const targetPost = posts.find(p => String(p.from.id) === comment.fromId); return( <div key={comment.id} className={classes.Comment}> <span style={{fontWeight: 'bold'}}> {targetPost ? targetPost.from.username : '匿名用户'} </span> <label>{comment.content}</label> </div> ) })
方案2:调整useEffect依赖,确保posts加载完成后再获取评论
将获取评论的useEffect依赖改为posts,保证posts数据就绪后再请求评论:
useEffect(()=>{ if (!id) return; // 先判断id是否存在 instance.get(`https://breddit.equaleyes-solutions.com/posts/${id}/comment`) .then(function (res) { console.log(res.data) setComment(res.data) }) .catch(function (res) { console.log(res) }) },[id, posts]) // 添加posts作为依赖
方案3:移除子组件的重复getPosts调用
父组件已经在挂载时调用了dispatch(getPosts(filter)),子组件无需重复调用,直接复用父组件加载好的posts数据即可,减少不必要的请求和时序问题:
// 移除子组件中的这段代码 // useEffect(() => { // dispatch(getPosts(filter)); // }, [dispatch, filter]);
方案4:从父组件传递目标帖子数据(可选优化)
既然父组件已经找到了当前的post,可以直接将post.from相关数据传递给子组件,避免子组件再次从posts列表中查找:
// 父组件Post中修改CommentSection的调用 <CommentSection id={id} postFrom={post.from} /> // 子组件CommentSection修改props interface CommentSectionProps { id?: string; postFrom?: { id: string; username: string }; } // 渲染时直接使用传递的postFrom <span style={{fontWeight: 'bold'}}>{props.postFrom?.username || '匿名用户'}</span>
这些方案可单独或组合使用,优先用方案1和方案3快速解决错误,再根据需求优化数据传递逻辑。
内容的提问来源于stack exchange,提问作者povodnikt
相关产品推荐
相关产品推荐

