#目標
題名の通り、redux
で管理した情報に基づきRedirect
を行います。
具体的に実装するのは、ログインした人じゃないと見れないページを作るというものです。
#実装していく
まずはトップのルーティングの部分
App.js
import PrivateRoute from './PrivateRoute';
const App = () => {
return (
<Switch>
<PrivateRoute path="/" exact component={TopPage} />
<Route path="/login" component={Login} />
<Route component={NotFoundPage} />
</Switch>
);
};
ここでPrivateRoute
というものを自分で作っています。
PrivateRoute
をみていきましょう。
PrivateRoute.js
import React from 'react';
import { connect } from 'react-redux';
import { Route, Redirect } from 'react-router-dom';
const PrivateRoute = ({user, component: Component, ...rest}) => {
return (
<Route
{...rest}
render={props =>
user ? (
<Component {...props} />
) : (
<Redirect to='/login' />
)
}
/>
);
}
const mapStateToProps = state => {
return {
user: state.auth.user
}
}
export default connect(mapStateToProps)(PrivateRoute);
ここでredux
で管理しているuser
の真偽により、偽であれば/login
にRedirect
します。
reducers/authReducer.js
const initialState = {
user: false
}
export default (state = initialState, action) => {
switch(action.type) {
case 'LOG_IN':
return { ...state, user: true };
case 'LOG_OUT':
return { ...state, user: false };
default:
return state;
}
}
お試しに実装したのでreducer
では大したことはしていません。
あとでfirebase
でのGoogleログインにしようと思っているのでその時は少し考えなければいけないかも。
最後にログインのコンポーネント
components/Login/index.js
import React from 'react';
import { connect } from 'react-redux';
import { login } from '../../actions';
class Login extends React.Component {
reduxLogin = () => {
const { login, history } = this.props;
login();
history.push('/');
}
render() {
return (
<div>
<button onClick={this.reduxLogin}>login redux</button>
</div>
);
}
}
export default connect(null, { login })(Login);
ログインのボタンを用意してログインするとトップページに飛ぶようにしています。
ログインしないでトップページに飛ぼうとしても/login
にRedirect
されます。
#まとめ
今回はreact-router
のRedirect
についてみました。
参考になれば幸いです。