2016-12-08 5 views
1

Ich habe eine Art von Assistenten, wo jeder Schritt seinen eigenen Weg hat. Wenn ein Benutzer jetzt eine direkte Verbindung zur Route des zweiten Schritts verwendet, möchte ich ihn zum ersten Schritt (mit browserHistory.replace) umleiten.Kann ich im React-Komponenten-Lebenszyklus eine Routenänderung ausführen?

Das Problem, dem ich gegenüberstehe, ist, dass ich nicht wirklich weiß, welche Stufe im Lebenszyklus der Komponenten es durchgeführt werden sollte. Ich habe versucht, constructor, render, componentWillMount, aber alle diese nicht verhindern, dass die Komponente Rendering auch wenn ich Router verwende. Was passiert, ist, dass Redirect auftritt, aber die Komponente von der vorherigen Route immer noch rendert und fehlschlägt (offensichtlich keine Daten).

Gibt es eine "richtige" Art der Umleitung während der Komponenteninitialisierung (ich muss den Zustand überprüfen)? Oder gibt es einen anderen besseren Weg?

+0

Der beste Weg wäre Umleitung auf dem Server, die vermutlich getroffen werden, wenn ein Benutzer auf eine direkte Verbindung geht. Ist das in Ihrem System möglich? Sie können Redirects auf dem Server mit 'react-router' abfangen und die entsprechende Antwort senden – Bojangles

+0

Wenn ich die Umleitung auf dem Server mache, dann wird es in der Historie gespeichert und die Zurück-Schaltfläche wird eine Art Schleife sein, deshalb verwende ich ersetzen. Ich habe auch einen absolut ignoranten Server, der nur Dateien (SPA) dient. –

Antwort

1

Ich weiß nicht, die „offizielle“ empfohlene Weg (immer noch interessiert, wenn jemand es finden kann), aber was für mich gearbeitet, ist dies:

  1. Redirect während componentWillMount
  2. Während der Benutzung machen die gleiche Zustand, wie in componentWillMount zu null zurück

Beispiel:

class MyComponent extends Component { 

    componentWillMount() { 
    if (!this.props.data) { 
     browserHistory.replace(myRoute); 
    } 
    } 

    render() { 
    if (this.props.data) { 
     return (
     <div> 
     ... 
     </div> 
    ); 
    } 

    return null; 
    } 
} 
+0

'componentWillMount' ist wahrscheinlich das früheste, dass Sie' this.props.data' (vermutlich von Redux) für Sie verfügbar haben, also denke ich, das ist die beste Lösung für jetzt – Bojangles

+1

Sie können es tatsächlich im Konstruktor bekommen, aber React nicht wie Weiterleitungen dort :) –

1

In v2/3 sollten Sie die Funktion onEnter umleiten (mit der Funktion replace). v2/3 repliziert die meisten Lifecycle-Funktionen von React, da es React nicht zum Rendern von Routen-Komponenten verwendet. Das heißt, <Route> s werden nur für die Konfiguration verwendet und react-router generiert ein Array von Komponenten für eine bestimmte Route und rendert sie einzeln.

+0

Problem mit onEnter, ist, dass ich den Zustand dort noch nicht habe, also muss ich irgendwie Verbindung zum redux Speicher herstellen und es von dort extrahieren und die Logik für das Erhalten des Zustandes effektiv d in Komponente verwendet) –

+0

Welche Art von Staat? Sie können den Status an den für die Navigation verwendeten Standort anhängen. Wenn Sie direkt zu einem Ort navigieren, lautet der Status "null". Wenn der Assistent beispielsweise von der ersten Seite zur zweiten navigiert, können Sie dem Speicherort den Status "{canLoad: true}" hinzufügen. Wenn der 'onEnter' der zweiten Seite aufgerufen wird, prüft er' nextState.canLoad' und leitet um, wenn dieser Wert nicht 'wahr' ist. –

+0

Wir hatten eine Diskussion mit meinen Kollegen über Komponente vs Router, um diese Dinge zu überprüfen. Und wir kamen zu dem Schluss, dass es sich eher um einen Komponenten-Job als um eine Navigation handelt, bei der wir uns der Geschäftslogik nicht zu sehr bewusst sein wollten. Aber ich denke, in beiden Ansätzen gibt es Vor- und Nachteile. –

Verwandte Themen