2016-06-22 26 views
1

私は反応とフラックスの初心者です。事実、ReactRouter(2.4)を使用しているときに以下の問題が発生しました。フラックス通知後にReactRouterが正しくリダイレ​​クトされない

私はhashHistoryを使用しています。成功した後は、「/ login」ページにリダイレクトする必要がありますログイン試行。

ルータ

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

ログインページ

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); 
} 
... 

フローは次のとおりです。1つの提出、authActionsおよびストア後

  1. 件のデータ(AJAX呼び出し関係を)手の込んだ。
  2. ログイン試行が正常であれば、AuthStoreは「ログイン」信号を出力します...
  3. ...私はnotifyLogin()を実行できます。

問題があります:this.props.router.push( '/')は正しくリダイレ​​クトされず、URLは変更されますが、ページは表示されません(状態の更新がトリガーされないように見えます)。

handleSubmit関数にthis.props.router.push( '/')を置くと奇妙なことですが、リダイレクトは完全に機能します。

何が起こっているのか考えてみませんか?

答えて

0

これは、これまで私のためによく働いています

  • ログイン/認証状態を含むコンポーネントで、あなたのアプリを包みます。レンダリングの
  • ログインしていない場合は、アプリのコンポーネント

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

+0

オム、はいをレンダリングし、そうでない場合は、ログインページコンポーネントをレンダリングします。私はそれを行うことができることを知っています。しかし、ポイントは、呼び出し元のコンポーネントの内部でスイッチをトリガーするためにストアからの通知を使用して行っていました。私はもっ​​と深く掘り下げました。私はそれがコールのスタックに関連する何かを信じています。 店内の排出量がコンポーネント内の「通知」を呼び出すのと同じ呼び出しで、コンポーネントを交換しようとしましたが、スタック呼び出しが間違ったコンテキストで後方に移動しようとしました...そのようなものでなければなりません... –

+0

私が非同期コールバックを行った場合、私はそれを試してみたことがますます確信しています: setTimeout(()=> { this.props.router.push( '/'); }、1000) ; それは動作しますが、それはハックです...誰も良いアイデアを持っていますか? コールバックで派遣するのではなく、店にアキシオの約束を渡すのは間違っていますか? –

+0

ああ、ok @ user3549754それでもコンポーネントはログインアクションをトリガします。ログインが成功すると、そのアクションによってuser_authenticatedアクションが送出され、ログイン・ストアで設定されます。これで、ログインストアに新しい小道具が届きます。 userAuthenticated propがtrueの場合にリダイレクトするcomponentWillUpdateを追加します。 –

関連する問題