如何使用React Router v4访问React应用程序之外的历史记录实例?

时间:2017-04-17 16:18:53

标签: javascript reactjs react-router react-router-v4 react-router-dom

我有一个React应用程序,它共享一个外部脚本文件,用vanilla JS构建一个公司范围的头文件。在该标题中是一个动态绑定到任何应用程序调用它的根的徽标(location.origin)。

捕获点击导航并使用React Router v3之前很简单,因为在您设置路径的任何地方都会访问browserHistory:

import { browserHistory } from 'react-router';

function captureLogoClick() {
    const logoLink = document.querySelector('#company-header .logo a');

    if(logoLink) {
        logoLink.addEventListener('click', (e) => {
            e.preventDefault();
            browserHistory.push('/');
        });
    } else {
        // Resource hasn't loaded yet
        setTimeout(captureLogoClick, 100);
    }
}
captureLogoClick();

使用React Router v4(react-router-dom),如何在不将侦听器绑定到组件内部并使用props.history的情况下完成此操作?

1 个答案:

答案 0 :(得分:2)

我认为你可以导出你创建的历史对象并传入路由器,然后直接用它来代替browserHistory

// app.js

import { Router } from 'react-router'
import createBrowserHistory from 'history/createBrowserHistory'

export const myHistory = createBrowserHistory()

<Router history={myHistory}>
  <App/>
</Router>

// header.js

import { myHistory } from './app.js';

function captureLogoClick() {
  const logoLink = document.querySelector('#company-header .logo a');

  if(logoLink) {
    logoLink.addEventListener('click', (e) => {
      e.preventDefault();
      myHistory.push('/');
    });
  } else {
    // Resource hasn't loaded yet
    setTimeout(captureLogoClick, 100);
  }
}
captureLogoClick();