以下のように、また"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()
が呼び出される前に/マウントをレンダリングすることです。理想的には、レンダリングはコールバックが起動するまで待機します。
私はこれがどのように機能するのか誤解していますか?特定の条件が成立するまでルートコンポーネントの描画を遅らせる方法はありますか?
これは本当に素晴らしい考えです。ありがとうございます!それでもなお、これは「リダイレクト」のように扱われるべきであると感じています。権限のないユーザのブラウザを '/ login'のようなものにリダイレクトするべきではないと思いますか? –
私はしません。 URLは、インターネット上のリソースの安定した単位(ウェブなど)であり、誰かが自分の期待に反していると思うリンクを魔法のように変更する*と*あなたのユーザーを悩ますものです。代わりに、自分が望むページをレンダリングしますが、ログインしていません。ここにログインフォームがあります。他の場所をクリックする必要はなく、これを記入してサインインしてください。あなたが探していたコンテンツにアクセスできます "。はい、ユーザが明示的に呼び出せる専用の '/ login'ルートが必要ですが、リダイレクトする必要はありません。それは反応です。 –
"it's React"について詳しく説明します。ログインページでは、モジュール化されたコンポーネントを使用して署名を処理する必要があります。ユーザーがまだ承認されていないときに他のページでも使用します。サインインコンポーネントにはすべての認証コードが格納されていて、 'onAuthorized = {authorized => this.setState({authorized})}'プロパティを使用してブートストラップするだけで、ロードするページそれをUIに追加します。 –