18
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

認証情報をreduxで管理してreact-routerのRedirectを学ぶ

Last updated at Posted at 2019-05-23

#目標
題名の通り、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の真偽により、偽であれば/loginRedirectします。

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

ログインのボタンを用意してログインするとトップページに飛ぶようにしています。
ログインしないでトップページに飛ぼうとしても/loginRedirectされます。

#まとめ
今回はreact-routerRedirectについてみました。
参考になれば幸いです。

18
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?