コンポーネントをマウントする前の承認チェックのベストプラクティスは何ですか?
反応ルーター1.xを使用します
ここに私のルートがあります
React.render((
<Router history={History.createHistory()}>
<Route path="/" component={Dashboard}></Route>
<Route path="/login" component={LoginForm}></Route>
</Router>
), document.body);
ダッシュボードコンポーネントは次のとおりです。
var Dashboard = React.createClass({
componentWillMount: function () {
// I want to check authorization here
// If the user is not authorized they should be redirected to the login page.
// What is the right way to perform this check?
},
render: function () {
return (
<h1>Welcome</h1>
);
}
});
React router v4のソリューションを更新
<Route
path="/some-path"
render={() => !isAuthenticated ?
<Login/> :
<Redirect to="/some-path" />
}/>
v3までのReactルーター
「onEnter」イベントを使用し、ユーザーが承認されているかどうかをコールバックで確認します。
<Route path="/" component={App} onEnter={someAuthCheck}>
const someAuthCheck = (nextState, transition) => { ... }
React-router 4では、コンポーネント内の Route props にアクセスできます。ユーザーをリダイレクトするには、新しいURLを履歴にプッシュするだけです。あなたの例では、コードは次のようになります。
var Dashboard = React.createClass({
componentWillMount: function () {
const history = this.props.history; // you'll have this available
// You have your user information, probably from the state
// We let the user in only if the role is 'admin'
if (user.role !== 'admin') {
history.Push('/'); // redirects the user to '/'
}
},
render: function () {
return (
<h1>Welcome</h1>
);
}
});
ドキュメントでは、render
の代わりにcomponent
プロパティを使用して、 別の方法 を示しています。これらはPrivateRoute
を定義します。これにより、すべてのルートを定義するときにコードが非常に明確になります。
複数のコンポーネントに認証を適用する場合、次のように実行できます。
<Route onEnter={requireAuth} component={Header}>
<Route path='dashboard' component={Dashboard} />
<Route path='events' component={Events} />
</Route>
単一コンポーネントの場合
<Route onEnter={requireAuth} component={Header}/>
function requireAuth(nextState, replaceState) {
if (token || or your any condition to pass login test)
replaceState({ nextPathname: nextState.location.pathname },
'/login')
}