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

使用React Router v5和Redux时如何向路由组件传递自定义props

问题根因与修复方案

核心问题1:嵌套路由匹配逻辑错误

你把Movies组件挂载在/movies父路径下,内部子路由写的绝对路径没有带上父级前缀,且第一个子路由path="/"会命中所有/movies开头的路径,导致后面的路由永远不会触发,你拿到的永远是第一个路由传入的props。

核心问题2:useEffect依赖项缺失

你没有把props.class_name、props.scope加入useEffect依赖数组,就算路由切换传入了新的props,也不会重新触发API请求。

修正后的代码

1. 调整Movies组件的路由配置

function Movies() {   
  return (
    <Switch>
      {/* 注意子路由路径要补全父级前缀,且精确匹配放最前面 */}
      <Route path="/movies/trending" exact={true}>
        <MediaGridContainer class_name="movies" scope="trending" />
      </Route>
      <Route path="/movies/disliked">
        <MediaGridContainer class_name="movies" scope="disliked" />
      </Route>
      {/* 通配路由放最后 */}
      <Route path="/movies">
        <MediaGridContainer class_name={"movies"} scope={"popular"} />
      </Route>
    </Switch>   
  ); 
}

2. 调整MediaGrid.jsx的useEffect依赖

function MediaGrid({ props }){
  useEffect(() => {
    loadObjects(props.class_name, props.scope).then(() => {
      // 加载完成逻辑
    });
  }, [dispatch, loadObjects, props.class_name, props.scope]); // 新增两个props作为依赖
  // 其余代码保持不变
}

可选优化(非必须)

你可以直接把ownProps的字段解构到返回值里,不用额外包裹一层props字段,代码可读性更高:

// MediaGridContainer.js
const mapStateToProps = (state, ownProps = {}) => {
  return {
    class_name: ownProps.class_name,
    scope: ownProps.scope
  };
}

// MediaGrid.jsx 就可以直接接参数
function MediaGrid({ class_name, scope }){
  useEffect(() => {
    loadObjects(class_name, scope).then(() => {
      // 逻辑
    });
  }, [dispatch, loadObjects, class_name, scope]);
}

修改完成后分别访问/movies、/movies/trending、/movies/disliked即可触发不同的API请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 09:48:03