zoukankan      html  css  js  c++  java
  • react privateRoute

    import React from 'react';
    import PropTypes from 'prop-types';
    import {Route,Redirect,withRouter} from 'react-router-dom';
    import LoginUser from 'service/LoginUser';
    
    //私有路由,只有登录的用户才能访问
    class PrivateRoute extends React.Component{
        constructor(props) {
            super(props);
            this..state = {
                isAuth : _loginUser.hasLogin();
            }
        }
        componentWillMount(){
            if(!isAuth){
              const {history} = this.props;
              setTimeout(() => {
                history.replace("/login");
              }, 1000)
            }
        }
        render(){
            const { component: Component,path="/",exact=false,strict=false} = this.props;
            return this.state.isAuth ?  (
                <Route  path={path} exact={exact}  strict={strict}  render={(props)=>( <Component {...props} /> )} />
            ) : <Authenricated />;
        }
    }
    PrivateRoute.propTypes  ={
            path:PropTypes.string.isRequired,
            exact:PropTypes.bool,
            strict:PropTypes.bool,
            component:PropTypes.func.isRequired
    }
    export default withRouter(PrivateRoute);

     使用redux:

    import { Component } from 'react'
    import { connect } from 'react-redux'
    import { get } from 'lodash'
    import PropTypes from 'prop-types'
    import toastr from 'toastr'
    import { Route } from 'react-router-dom'
    import { Redirect } from 'react-router'
    import { LoadingIndicator } from 'components'
    
    
    export class PrivateRoute extends Component {
      constructor (props) {
        super(props)
    
        this.state = {
          isLoading: true, // 是否於權限檢核中
          isAuthed: false  // 是否通過權限檢核
        }
      }
    
      static propTypes = {
        component: PropTypes.any.isRequired,
        funcCode: PropTypes.string.isRequired
      }
    
      checkAuth = async () => {
        let isAuthed = false
        const { isLogin, funcCode } = this.props
    
        if (isLogin) {
          
          this.setState(state => ({ ...state, isLoading: true }))
    
          isAuthed = await api.checkAuthWithServer(funcCode)
        }
    
        if (!isAuthed) {
         
          toastr.warning('系統未登录,请先登录')
        }
    
        // 更新狀態 1.檢核結束 2.檢核結果
        this.setState(state => ({ ...state, isAuthed: isAuthed, isLoading: false }))
      }
    
      componentWillMount = async () => {
        await this.checkAuth()
      }
    
      componentWillReceiveProps = async (nextProps) => {
        if (nextProps.location.pathname !== this.props.location.pathname) {
          await this.checkAuth()
        }
      }
      
      render () {
        const { component: Component, ...rest } = this.props
        const { isLoading, isAuthed } = this.state
    
        return (
          isLoading === true
            ? <LoadingIndicator />
            : <Route {...rest} render={props => (
                isAuthed
                  ? <Component {...props} />
                  : <Redirect to={{ pathname: '/login', state: { from: props.location } }} />
              )} />
        )
      }
    
    }
    
    const mapStateToProps = state => ({
      // 登入系統後會於 redux 中註記登入狀態
      isLogin: get(state, 'auth.isLogin')
    })
    
    const mapDispatchToProps = dispatch => ({
    })
    
    export default connect(mapStateToProps, mapDispatchToProps)(PrivateRoute)

     update privateRoute:

    import React from 'react';
    import {toastr} from "react-redux-toastr";
    import {Route, withRouter} from 'react-router-dom';
    import LoginUser from 'service/login-service/LoginUser';
    
    import Unauthorized from "page/error/Unauthorized";
    
    const _loginUser = new LoginUser();
    //私有路由,只有登录的用户才能访问
    class PrivateRoute extends React.Component{
        constructor(props) {
            super(props);
            this.state = {
                isAuth : _loginUser.hasLogin()
        }
        }
        componentWillMount(){
            if(!this.state.isAuth){
                toastr.error('login timeOut, return to the login page after 3s');
                const {history} = this.props;
                setTimeout(() => {
                    history.replace("/login");
                }, 3000)
            }
        }
        render(){
            const { component: Component, path="/", exact=false, strict=false} = this.props;
            return this.state.isAuth ?  (
                <Route  path={path} exact={exact}  strict={strict}
                        render={(props)=>( <Component {...props} /> )} />) : <Unauthorized />;
        }
    }
    export default withRouter(PrivateRoute);
  • 相关阅读:
    C++编程开发学习的50条建议(转)
    编程思想:我现在是这样编程的(转)
    Linux系统编程@多线程与多进程GDB调试
    字符串分割函数 STRTOK & STRTOK_R (转)
    C语言指针与数组的定义与声明易错分析
    C语言 a和&a的区别
    C语言二重指针与malloc
    【C语言入门】C语言的组成结构(基础完整篇)!
    程序员吐槽女友败家:开酒店必须400元起步,工资却不到自己的一半!
    怎样才能和编程语言对上眼?你需要做些准备以及...
  • 原文地址:https://www.cnblogs.com/Nyan-Workflow-FC/p/8794706.html
Copyright © 2011-2022 走看看