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

React Router v4多ReactDOM.render实例共享History问题求助

解决React Router v4多ReactDOM.render实例共享history的问题

这个问题的核心在于你现在的两个React实例各自使用了独立的history对象:第一个用BrowserRouter时它会内部自动创建一个history,第二个又手动调用createBrowserHistory生成了新的,自然没法同步。要实现共享,只需要让两个实例使用同一个history实例就行,具体步骤如下:

1. 创建全局共享的history实例

新建一个单独的history.js文件,导出我们创建的history对象:

import { createBrowserHistory } from 'history';
export default createBrowserHistory();

2. 修改第一个ReactDOM.render的路由配置

把原来的BrowserRouter换成Router组件,并传入我们刚才创建的共享history:

// index.js 里修改路由部分
import { Router } from 'react-router-dom'; // 替换BrowserRouter为Router
import history from './history'; // 导入共享的history

ReactDOM.render(
  <Provider store={store}>
    <AppContextProvider>
      <Router history={history}> {/* 用Router替代BrowserRouter,传入共享history */}
        <App />
      </Router>
    </AppContextProvider>
  </Provider>,
  document.getElementById('root')
);

3. 修改第二个ReactDOM.render的路由配置

不要重新创建history,而是导入同一个共享的history实例:

// Map.js 里修改
import { Router } from 'react-router-dom';
import history from './history'; // 导入同一个history
import store from './store'; // 确保这里的store和index.js是同一个实例

const popUpHTML = (
  <Provider store={store}>
    <Router history={history}> {/* 使用共享的history */}
      <PopUpClick name={name} img={img} id={id} />
    </Router>
  </Provider>
);

为什么这样可行?

BrowserRouter是React Router提供的高层封装组件,它会在内部自动创建一个createBrowserHistory实例并维护。而Router组件则允许我们手动传入自定义的history对象,这样两个React应用实例就共用了同一个history栈,路由跳转、URL变更、回退操作都会同步生效。

另外要注意,两个实例必须使用同一个Redux store(你代码里已经在传递store,只要保证导入的是同一个实例就没问题),这样路由相关的状态(如果有的话)也能保持一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 10:07:46