2017-02-14 2 views
0

Ich habe zwei React-Komponenten wie diese gerendert.Mehrere ReactDOM.render-Aufrufe mit gemeinsamem Router-Kontext

ReactDOM.render(
    <Router history={ browserHistory }> 
    <Route path='/items' component={ App }> 
     <IndexRoute component={ Home } /> 
     <Route path='/items/:id' component={ Details } /> 
    </Route> 
    </Router>, 
    document.getElementById('app') 
); 

Und die zweite, die eine Seitenleiste ist.

ReactDOM.render(
    <Sidebar />, 
    document.getElementById('sidebar') 
); 

Ich möchte die Link- Helfer verwenden, um von reagieren-Router in der Sidebar Komponente. Ich erhalte jedoch den folgenden Fehler: "Unerreichte Invariant-Verletzung: Links, die außerhalb eines Router-Kontextes gerendert werden, können nicht navigieren.". Was sinnvoll ist, da die Sidebar nicht wie im ersten Beispiel im Routerkontext liegt.

Gibt es eine Möglichkeit, den Router-Kontext mit der Sidebar zu teilen?

Ich mag würde die Seitenleiste Layout auf der Strecke (und Zugriff Objekt der Router in this.props richtig) und verwenden Link- wie es sein sollte basierend ändern.

Ich möchte mich nicht mit Hacky-Ansätzen wie history.pushState oder parsing location.path auseinandersetzen, um das Layout der Seitenleiste entsprechend der entsprechenden Route der Elemente zu ändern.

+0

Warum wird der '' getrennt gerendert? Es sollte wahrscheinlich in Ihrer '' Komponente sein. Das würde die Dinge viel einfacher machen. –

+0

Ich weiß, aber die aktuelle Projektstruktur erlaubt mir nicht, eine einzelne Root-Komponente zu verwenden und lassen React die gesamte Site behandeln. Das wäre in der Tat viel einfacher, da '' dann Teil des Routerkontexts ist. Im Laufe der Zeit, wenn mehr von der Site/App in React (re) geschrieben wird, kommen wir einem allgemeinen Root-Element näher. Leider ist dies heute noch nicht der Fall. –

Antwort

1

Sie sollten in der Lage sein, nur Ihre Sidebar in einem eigenen <Router> zu rendern. Die wichtige Sache ist, dass sie die gleiche history Instanz teilen (in diesem Fall browserHistory).

Wenn ein <Router> angehängt wird, fügt er seiner history Instanz einen Listener hinzu. Wenn eine Instanz history einen neuen Standort empfängt, benachrichtigt sie alle ihre Listener.

ReactDOM.render((
    <Router history={browserHistory}> 
    <Route component={Sidebar} /> 
    </Router> 
) document.getElementById('sidebar') 
Verwandte Themen