2016-06-22 45 views
1

Ich bin ein Neuling im Reagieren und Flux. Ich stolperte auf folgendes Problem bei der Verwendung von ReactRouter (2.4)ReactRouter wird nicht richtig nach Flussbenachrichtigung umgeleitet

Ich benutze HashHistory und ich muss auf die "/" Seite umleiten, wenn ich in "/ Login" Seite nach einem erfolgreichen bin Anmeldeversuch.

Router

ReactDOM.render(
<Router history={hashHistory}> 
    <Route path="/" component={App}> 
     <IndexRoute component={ErasmusPage} onEnter={authCheck}></IndexRoute> 
     <Route path="login"component={withRouter(LoginPage)}></Route> 
    </Route> 
</Router>, app); 

Login Seite

constructor() { 
    super(); 
    this.notifyLogin = this.notifyLogin.bind(this); 
    this.state = { 
     email: "", 
     password: "" 
    }; 
} 

componentWillMount() { 
    authStore.on("login", this.notifyLogin); 
} 

componentWillUnmount() { 
    authStore.removeListener("login", this.notifyLogin); 
} 

notifyLogin() { 
    this.props.router.push('/'); 
} 

... 

handleSubmit(e) { 
    e.preventDefault(); 

    let data = { 
     email: this.state.email, 
     password: this.state.password 
    }; 
    AuthActions.authenticate(data); 
} 
... 

Die Strömung ist:

  1. nach einem einreicht, authActions und Shop erarbeiten die Daten (Ajax-Aufruf beteiligt) .
  2. Wenn der Anmeldeversuch in Ordnung ist, sendet AuthStore ein "Login" -Signal ...
  3. ... so kann ich notifyLogin() ausführen.

Das Problem ist: this.props.router.push (‚/‘) umleiten nicht richtig, es ändert sich die URL aber nicht die Seite (es sieht aus wie der Zustand Refresh nicht ausgelöst wird erhalten).

Seltsame Sache ist, wenn ich this.props.router.push ('/') in der handleSubmit-Funktion die Umleitung funktioniert perfekt.

Irgendeine Idee von was ist los? Diese

Antwort

0

hat gut funktioniert für mich so weit:

  • Wickeln Sie Ihre Anwendung in einer Komponente, die Login/Auth Zustand enthält.
  • auf machen, wenn nicht angemeldet, die Login-Seite Komponente machen, sonst machen die App Komponente

render() { 
 
    const { isAuthorized, authError} = this.props; 
 
    
 
    if (isAuthorized) { 
 
    return (<Layout />); 
 
    } 
 
    
 
    return (<Login authError={authError}/>); 
 
}

+0

Ähm, ja. Ich weiß, dass ich das kann. Der Punkt bestand jedoch darin, die Benachrichtigung aus dem Speicher zu verwenden, um den Switch innerhalb der aufrufenden Komponente auszulösen. Ich grub tiefer und ich glaube, es ist etwas mit dem Stapel von Anrufen verwandt. Die Emission in der Filiale ruft die "notify" in der Komponente, als in dem gleichen Aufruf versuche ich, Komponente zu tauschen, aber der Stack-Aufruf versucht, im falschen Kontext rückwärts zu gehen ... es muss so etwas sein ... –

+0

Uhmm, mehr und mehr davon überzeugt, dass, wenn ich einen asynchronen Rückruf hatte, es funktioniert haben könnte Ich versuchte mit einem: setTimeout (() => { this.props.router.push ('/'); }, 1000) ; Es funktioniert, aber es ist ein Hack ... jemand hat eine bessere Idee? Ist es falsch, das Versprechen von Axios an den Laden zu übergeben, statt in den Callbacks zu versenden? –

+0

Ah, ok @ user3549754, dann löst Ihre Komponente nur eine Login-Aktion aus. Wenn die Anmeldung erfolgreich ist, löst diese Aktion eine Aktion "user_authenticated" aus, die diese im Anmeldestore festlegt. Jetzt erhält dein Login Store neue Requisiten. Fügen Sie eine KomponenteWillUpdate hinzu, die umleitet, wenn userAuthenticated prop wahr ist. –

Verwandte Themen