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

React Router v6类组件中withRouter自定义实现报错求助

问题解决与设计说明

一、编译报错解决方法

你遇到的报错是因为with-router.jsx文件中没有导出withRouter函数,官方示例代码遗漏了导出语句。只需在文件末尾添加导出语句即可修复:

修改后的with-router.jsx代码:

import {
    useLocation,
    useNavigate,
    useParams,
} from "react-router-dom";

function withRouter(Component) {
    function ComponentWithRouterProp(props) {
        let location = useLocation();
        let navigate = useNavigate();
        let params = useParams();
        return (
            <Component
                {...props}
                router={{ location, navigate, params }}
            />
        );
    }

    return ComponentWithRouterProp;
}

// 添加导出语句
export default withRouter;

修复后,类组件中可通过this.props.router.params获取动态路由参数,示例如下:

class Product extends Component {
    render() {
        // 获取并打印动态路由参数
        console.log(this.props.router.params);
        return (
            <div className="product">...</div>
        );
    }
}

二、关于withRouter移除的设计合理性

React Router v6移除withRouter是基于以下核心考量:

  • 优先函数组件与Hooks:v6全面转向函数组件优先的设计,useParams、useNavigate等Hooks能更直接地获取路由信息,高阶组件模式(withRouter)显得冗余,移除它是为了引导开发者使用更现代的React写法。
  • 按需定制,减少冗余:手动实现withRouter可让你根据组件实际需求传递路由属性,比如只传params而不需要location或navigate,避免不必要的props传递,让组件更轻量化。
  • 精简库体积:将这类非核心的适配功能交给开发者按需实现,能有效减少React Router库本身的体积,提升整体加载性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:55:23