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

React项目withRouter导入失败及Redux集成问题求助

React Router v6 + Redux 集成问题解决

问题说明

集成react-router-dom与Redux时,因react-router-dom v6移除了withRouter API,导入时报错;自行实现withRouter后仍存在运行错误,相关错误截图及项目代码如下:

  • 当前运行错误截图:当前错误截图
  • withRouter导入错误截图:withRouter导入错误截图

项目代码

index.js

import React from 'react';
import ReactDOM from 'react-dom/client';
import 'bootstrap/dist/css/bootstrap.min.css'
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { BrowserRouter as Router} from 'react-router-dom'

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.Fragment>
    <Router>
      <App />
    </Router>
  </React.Fragment>
);

reportWebVitals();

App.js

import './App.css';
import Main from './components/MainComponent';
import React,{ Component } from 'react';
import { Provider } from 'react-redux'
import { ConfigureStore } from './redux/configurStore'

const store= ConfigureStore()

class App extends Component {
  render(){
    return (
      <Provider store={store}>
        <div className="App">
          <Main />
        </div>
      </Provider>
    );
  }
}

export default App;

reducer.js

import { DISHES } from "../shared/dishes"
import { COMMENTS } from '../shared/comments';
import { PROMOTIONS } from '../shared/promotiones';
import { LEADERS } from '../shared/leaders'

export const initialState = {
    dishes: DISHES,
    comments: COMMENTS,
    promotions: PROMOTIONS,
    leaders: LEADERS
};

export const Reducer = (state = initialState, action) => {
    return state ;
};

configurStore.js

import createStore from 'redux';
import { Reducer, initialState } from './reducer'

export const ConfigureStore = () => {
    const store = createStore(
        Reducer, 
        {},
        initialState
    );

    return store;
}

MainComponent.js

import { Routes, Route } from "react-router-dom";
import { connect } from 'react-redux';

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

const mapStateToProps = state => {
  return {
    dishes: state.dishes,
    comments: state.comments,
    promotions: state.promotions,
    leaders: state.leaders
  }
}
class Main extends Component {
    constructor(props) {
        super(props);
      }

  render(){
    return null; // 原代码未返回内容,建议补充路由渲染逻辑
    }
}
export default withRouter(connect(mapStateToProps)(Main));

解决步骤

1. 修复自定义withRouter实现

当前实现存在三个问题:未导入路由Hook、外层函数未返回包装组件、高阶组件包裹顺序错误,修改后的MainComponent.js如下:

// 补充导入路由Hook
import { Routes, Route, useLocation, useNavigate, useParams } from "react-router-dom";
import { connect } from 'react-redux';

function withRouter(Component) {
  function ComponentWithRouterProp(props) {
    const location = useLocation();
    const navigate = useNavigate();
    const params = useParams();
    return (
      <Component
        {...props}
        location={location}
        params={params}
        navigate={navigate}
      />
    );
  }
  // 返回包装后的组件
  return ComponentWithRouterProp;
}

const mapStateToProps = state => {
  return {
    dishes: state.dishes,
    comments: state.comments,
    promotions: state.promotions,
    leaders: state.leaders
  }
}

class Main extends Component {
    constructor(props) {
        super(props);
      }

  render(){
    // 补充路由渲染逻辑示例
    return (
      <Routes>
        {/* 可添加具体路由配置,比如:
        <Route path="/" element={<Home />} />
        */}
      </Routes>
    );
    }
}

// 调整顺序:先包装withRouter,再连接Redux
export default connect(mapStateToProps)(withRouter(Main));

2. 修复Redux Store配置错误

configurStore.js存在导入错误和参数传递错误,修改后如下:

// 改为命名导入createStore
import { createStore } from 'redux';
import { Reducer, initialState } from './reducer'

export const ConfigureStore = () => {
    // 正确传递预加载状态作为第二个参数
    const store = createStore(
        Reducer, 
        initialState
    );

    return store;
}

3. 可选优化:转为函数组件

推荐将Main改为函数组件,直接使用Hook无需自定义withRouter:

import { Routes, Route, useLocation, useNavigate, useParams } from "react-router-dom";
import { useSelector } from 'react-redux';

function Main() {
  // 直接用Redux Hook获取状态
  const dishes = useSelector(state => state.dishes);
  const comments = useSelector(state => state.comments);
  const promotions = useSelector(state => state.promotions);
  const leaders = useSelector(state => state.leaders);

  // 直接用路由Hook
  const location = useLocation();
  const navigate = useNavigate();
  const params = useParams();

  return (
    <Routes>
      {/* 路由配置 */}
    </Routes>
  );
}

export default Main;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 02:20:18