【问题标题】:How can I access the history instance outside of React app with React Router v4?如何使用 React Router v4 访问 React 应用程序之外的历史实例?
【发布时间】:2017-09-13 07:01:36
【问题描述】:

我有一个 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 的情况下完成此操作?

【问题讨论】:

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


    【解决方案1】:

    我认为您可以将创建的历史对象导出并传入路由器,然后直接使用它来代替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();
    

    【讨论】:

    • 我应该澄清一下我正在使用 v4 中的 react-router-dom - 它看起来不像接受历史道具:-/
    • 好的,替代方案:只使用浏览器的原生 window.history.pushState。如果您想要 history 包提供的兼容性,我认为您可以只使用 createBrowserHistory() 并使用它,而不必担心将其绑定到任何地方或与 react-router 共享它。这有点像在黑暗中拍摄,但试试看?我认为它会毫无问题地工作。
    • 原生历史不会触发重新渲染。我认为如果无法访问路由器中的历史单例,它将无法正常工作
    • 好吧好吧,我要回到我原来的答案。检查BrowserRouter 源,您会发现使用基本路由器代替它很容易。 Boom,访问你的全局历史对象。
    • 我完全同意,我想我只是更想使用-dom 包,以防添加新功能。
    猜你喜欢
    • 1970-01-01
    • 2017-08-23
    • 2018-01-26
    • 2018-11-07
    • 2017-07-29
    • 2018-01-01
    • 2017-08-31
    • 2018-05-14
    • 2016-09-30
    相关资源
    最近更新 更多