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

react-router-dom调用history.push改URL后组件不渲染问题求助

问题根因

你在App组件内部声明了createBrowserHistory()实例,每次App组件重渲染都会生成全新的history对象,Router组件绑定的history实例被替换后,旧实例触发的路由变更无法被新的Router识别,就会出现URL变化但对应组件不渲染的问题,刷新页面相当于重新初始化实例所以恢复正常。

修复方案
  • 第一步:把history实例的声明移到App组件外部,保证全局仅初始化一次
    调整后的App.js示例:
import React ,{ useState, useEffect } from "react";
import { createBrowserHistory } from "history";
import { Router, Route, Switch, Redirect } from "react-router-dom";
import { useSelector } from "react-redux";
import JsonData from "./data/data.json";
import axios from "axios";

// 移到组件外部,仅初始化一次,保证是单例
const hist = createBrowserHistory();

const App = () => {
  const [landingPageData, setLandingPageData] = useState({});
  useEffect(() => {
    setLandingPageData(JsonData);
  }, []);

  const { user: currentUser } = useSelector(state => state.auth);

  return (
    <Router history={hist}>
      {currentUser ? (
        <div>
          <Layout>
            <Switch>
              <Route path="/home" render={() => <Header data={landingPageData.Header} />} />
              <Route path="/destinations" render={() => <Destinations data={landingPageData.Destinations} />} />
            </Switch>
          </Layout>
        </div>
      ) : (
        <div>
          <Layout >
            <Switch>
              <Route path="/register-page" component={Register} />
              <Route path="/login" component={Login} />
            </Switch>
          </Layout>
        </div>
      )}
    </Router>
  );
};

// 无需用withRouter包裹App,withRouter仅对Router内部的子组件生效,App是Router的父组件,包裹属于无效操作
export default App;
  • 第二步:如果其他业务组件也需要调用history做跳转,可以把history单独抽成公共文件导出,保证所有场景用的是同一个实例:
// src/utils/history.js
import { createBrowserHistory } from 'history';
export default createBrowserHistory();

之后App.js引入该history传给Router,其他组件引入该history调用push方法即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:36:03