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

ReactJS组件接收数据后不更新:直接访问文章详情页加载异常

问题诊断与修复方案

嘿,这个问题的根源其实是Reducer中存储文章数据的key设置错误,导致组件从Redux Store里取不到对应的文章数据,所以一直停留在Loading状态。

问题分析

先看你的Reducer代码:

export default function(state = {}, action) {
  switch (action.type) {
    case FETCH_POST:
      // 这里的key是整个post对象,完全错误!
      return { ...state, [action.payload.data]: action.payload.data };
    default:
      return state;
  }
}

你把完整的post对象当成了state对象的key,而JavaScript对象的key只能是字符串/Symbol,这里会把对象强制转为[object Object],导致你的state.posts里根本没有以文章ID(比如2357)为key的条目。

但你的mapStateToProps是通过文章ID来取数据的:

function mapStateToProps({ posts }, ownProps) {
  return { post: posts[ownProps.match.params.id] };
}

这就导致直接访问URL时,post始终是undefined,组件一直渲染<Loader />。

至于从首页跳转正常的原因:首页的文章列表应该已经把数据以正确的ID为key存入了Store,所以跳转后能直接拿到数据;而直接访问URL时是单独请求这篇文章,Reducer存错了key,自然拿不到。

修复代码

只需要修改Reducer,把存储的key改成文章的ID即可:

export default function(state = {}, action) {
  switch (action.type) {
    case FETCH_POST:
      // 用文章ID作为key存储数据
      return { ...state, [action.payload.data.id]: action.payload.data };
    default:
      return state;
  }
}

验证流程

修改后再直接访问文章URL:

  1. 组件挂载后调用fetchPost请求数据
  2. 请求成功后,Reducer将文章数据以id为key存入Store
  3. mapStateToProps通过match.params.id正确拿到对应的post对象
  4. 组件渲染文章内容,不再显示Loading

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:01:09