1

私は外部スクリプトファイルを共有するReactアプリを持っており、vanilla JSで全社的なヘッダーを構築しています。そのヘッダーには、それが呼び出されているアプリケーションのルートに動的にバインドされたロゴがあります(location.origin)。React Router v4のReactアプリの外で履歴インスタンスにアクセスするにはどうすればよいですか?

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(); 

ではどのように、ルータV4(react-router-dom)を反応させることができる:あなたがルートを設定しているところはどこでもbrowserHistoryへのアクセスが発生するため

クリックしてナビゲーションをキャプチャし、代わりにルータV3を反応させるの使用は、前にささいなましたコンポーネントのどこかでリスナーをバインドせずにprops.historyを使用してこれを実現しますか?

答えて

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(); 
+0

私はV4から '反応-ルータdom'を使用していることが明らかになっている必要があります - それは歴史の小道具受け入れるようにそれは見ていません: -/ – jfurfaro

+0

[OK]を、代替手段を:ちょうどブラウザのネイティブウィンドウを使用します.history.pushState。ヒストリパッケージが提供する互換性が必要な場合は、 'createBrowserHistory()'だけで、どこにでもバインドしたり、反応ルータと共有したりすることなく心配する必要はありません。これは暗闇の中での一種のショットですが、試してみてください。私は*それが問題なく動作すると思う。 –

+0

ネイティブ履歴は再レンダリングを開始しません。私は、ルータの歴史シングルトンにアクセスすることなく、それは動作しませんと思います – jfurfaro

関連する問題