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

React类组件使用Link跨组件传递数据失败问题咨询

解决React Router Link传state无法在目标组件获取的问题

问题核心原因

目标类组件没有拿到React Router注入的路由属性,90%以上的该类问题都是这个原因,具体解决方法和你使用的React Router版本有关。

对应解决方法

如果你用的是React Router v5

  1. 首先确认目标组件是在路由配置中通过<Route>的component/render属性直接声明的,示例如下:
<Route path="/target-path" component={TargetComponent} />
  1. 如果目标组件是嵌套的子组件、没有直接注册在Route上,需要引入withRouter高阶组件包裹目标组件,注入路由属性:
import { withRouter } from 'react-router-dom';

class TargetComponent extends React.Component {
  // 组件原有逻辑
  componentDidMount() {
    // 这样就可以拿到传递的id
    console.log(this.props.location.state)
  }
}
// 导出时用withRouter包裹
export default withRouter(TargetComponent)

如果你用的是React Router v6

v6移除了内置的withRouter,且类组件不能直接使用Hook,需要自己封装高阶组件注入路由属性:

  1. 先封装公共的withRouter高阶组件:
import { useLocation, useNavigate, useParams } from 'react-router-dom';

const withRouter = (Component) => {
  function WrappedComponent(props) {
    const location = useLocation();
    const navigate = useNavigate();
    const params = useParams();
    return <Component {...props} router={{ location, navigate, params }} />
  }
  return WrappedComponent;
}
  1. 用该高阶组件包裹目标类组件导出:
class TargetComponent extends React.Component {
  // 组件原有逻辑
  componentDidMount() {
    // 这样就可以拿到传递的id
    console.log(this.props.router.location.state)
  }
}

export default withRouter(TargetComponent)

额外注意事项

  • Link的state存在浏览器会话内存中,不会拼接在URL上,如果用户手动输入地址、刷新页面、或者用window.open跳转,state都会丢失
  • 跳转前确认Link的pathname和目标路由注册的路径完全匹配,没有拼写、大小写错误
  • 取值时建议加非空判断,避免异常:const id = this.props.location?.state ?? '默认值'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:45:03