2016-09-16 16 views
2

以下のように、また"auth-flow" exampleに示されているように、React Router onEnter属性を使用して認証を処理しています。`onEnter`でコンポーネントレンダリングを遅らせることができますか?

function requireAuth(nextState, replace, next) { 
    Auth.validateToken() 
     .then(() => { 
     next(); 
     }) 
     .fail(() => { 
     replace('/login'); 
     next(); 
     }); 
    } 

    <Router history={history}> 
     <Route path="/" component={App} > 
     <IndexRoute 
      component={Dashboard} 
      onEnter={requireAuth} 
     /> 
     <Route 
      path="login" 
      component={LogInForm} 
     /> 
     </Route> 
    </Router> 

私のトークン検証は、サーバーの呼び出しを必要とするので、私はonEnterの非同期コールバック機能を使用しています。

私が遭遇している問題は、この例のDashboardコンポーネントは、next()が呼び出される前に/マウントをレンダリングすることです。理想的には、レンダリングはコールバックが起動するまで待機します。

私はこれがどのように機能するのか誤解していますか?特定の条件が成立するまでルートコンポーネントの描画を遅らせる方法はありますか?

答えて

3

経路のレンダリングを遅らせてはいけませんが、ユーザーの方がより効果的です。

実際にページをレンダリングするには、誰かがそれを見る権限を持っているかどうかを見るためのロジックが含まれていて、authorized: falseなどのようなものがあり、コールバックスイッチthis.setState({ authorized: resultFromCallback })を使用してください。状態変化が原因となること

値は異なっていた場合、あなたのページ、に再びrender()を呼び出すに反応して、あなたのページのrender()機能で、あなたは単にあなたが含まれているUIをユーザに提示する必要があるかどうかを確認するためにthis.state.authorizedをチェック匿名ユーザーとして表示する必要があるすべてのビット、または許可ユーザーとして表示する必要があるすべてのビット。

... 
    componentDidount() { 
    whateverlib.checkForAuthorization(this.handleAuthorization); 
    }, 
    handleAuthorization(authorized) { 
    this.setState({ authorized }); 
    }, 
    render() { 
    if(this.state.authorized) { 
     return this.renderAuthorizedUI(); 
    } 
    return this.renderAnonymousUI(); 
    }, 
... 

また、あなたのアプリはまだちょうどJavaScriptがWebページ上で実行されているので、なぜあなたも、あなたがロードすべてのページをチェックすることを覚えていますか?あなたがする必要があるのは、ページをチェックし、その結果を保存して完了することだけです。ユーザーがタブを開いたままにしておくと、認可状態が1つの反応ルータのアプリケーション管理ページから次のページに自動的に変更されるわけではないため、アプリグローバルトラッカーを使用できます。

var authorizer = require('./lib/whatever-thing-you-wrote-for-this'); 

var YourPage = React.createClass({ 
    ... 
    componentDidMount() { 
    if (!authorizer.isAuthorized()) { 
     authorizer.tryAuthorize(this.handleAuthorization); 
    } 
    }, 
    handleAuthorization() { 
    this.forceUpdate(); 
    }, 
    render() { 
    if(authorizer.isAuthorized()) { 
     return this.renderAuthorizedUI(); 
    } 
    return this.renderAnonymousUI(); 
    }, 
    ... 
}); 
+0

これは本当に素晴らしい考えです。ありがとうございます!それでもなお、これは「リダイレクト」のように扱われるべきであると感じています。権限のないユーザのブラウザを '/ login'のようなものにリダイレクトするべきではないと思いますか? –

+0

私はしません。 URLは、インターネット上のリソースの安定した単位(ウェブなど)であり、誰かが自分の期待に反していると思うリンクを魔法のように変更する*と*あなたのユーザーを悩ますものです。代わりに、自分が望むページをレンダリングしますが、ログインしていません。ここにログインフォームがあります。他の場所をクリックする必要はなく、これを記入してサインインしてください。あなたが探していたコンテンツにアクセスできます "。はい、ユーザが明示的に呼び出せる専用の '/ login'ルートが必要ですが、リダイレクトする必要はありません。それは反応です。 –

+0

"it's React"について詳しく説明します。ログインページでは、モジュール化されたコンポーネントを使用して署名を処理する必要があります。ユーザーがまだ承認されていないときに他のページでも使用します。サインインコンポーネントにはすべての認証コードが格納されていて、 'onAuthorized = {authorized => this.setState({authorized})}'プロパティを使用してブートストラップするだけで、ロードするページそれをUIに追加します。 –

関連する問題