react 路由封装及页面授权

好久不见. 提交于 2020-02-04 23:46:00

我所参考的博客

src下建一个router.js

import Landing from './components/layout/Landing'
import Login from './components/auth/Login'
import Register from './components/auth/Register'
import Dashboard from './components/dashboard/Dashboard'

let router = [
  {
    path: '/',//首页默认加载的页面
    componentName: Landing,
    exact: true, //是否为严格模式
  },
  {
    path: '/login',//后面是传递的参数id
    componentName: Login
  },
  {
    path: '/register',
    componentName: Register,
  },
  {
    path: '/dashboard',
    componentName: Dashboard,
    auth: true,//是否授权
    // routes: [  /** 嵌套路由  dashboard下面又有子页面*/
    //   {
    //     path: '/dashboard/',
    //     componentName: main,
    //     exact: false
    //   },
    // ]
  },
];

export default router;

app.js 引入router.js

import React, { Component } from 'react';
import {
  BrowserRouter as Router,
  Route,
  Redirect
} from 'react-router-dom';
import { connect } from 'react-redux'
import PrivateRoute from './common/PrivateRoute'
import store from './store';
import setAuthToken from './utils/setAuthToken'
import jwt_decode from 'jwt-decode'
import { setCurrentUser, logoutUser } from './actions/authActions'
import './App.css';
import Navbar from './components/layout/Navbar'
import Footer from './components/layout/Footer'
import router from './router'
// 防止页面刷新数据丢失
if (localStorage.jwtToken) {
  setAuthToken(localStorage.jwtToken)
  // 解析token
  const decoded = jwt_decode(localStorage.jwtToken)
  store.dispatch(setCurrentUser(decoded))
  // 判断token是否过期
  // 获取当前时间
  const currentTime = Date.now() / 1000
  // 当前时间大于过期时间
  if (currentTime > decoded.exp) {
    // 过期
    store.dispatch(logoutUser())
    window.location.href = '/login'
  }

}
export class App extends Component {
  render () {
    let { isAuthenticated } = this.props.auth
    return (
      <Router>
        <Navbar />
        <div className="App">
          {
            router.map((item, i) => {
              console.log('', item);
              return <Route exact={item.exact} path={item.path} key={i} render={(props) => {
                //登录情况下
                if (isAuthenticated) {
                  return <item.componentName {...props} routes={item.children} />
                }
                // 非授权页面
                if (!item.auth) {
                  return <item.componentName {...props} routes={item.children} />
                }
                // 未登录并页面授权时跳入登录页面
                return <Redirect to='/login' />
              }} />
            })
          }
          <Footer />
        </div >
      </Router>
    );
  }
}
// 获取reduce中在actions定义的initalStaten属性值
const mapStateToProps = (state) => ({
  auth: state.auth,
})
// dispatch 方法
const mapDispatchToProps = (dispatch) => {
  return {

  }
}
export default connect(mapStateToProps, mapDispatchToProps)(App)

二级路由使用

import React, { Component } from 'react';
import { Route, Link } from "react-router-dom";

class User extends Component {
    constructor(props) {
        super(props);
    }

    render() {
//接收父级页面传来的属性
        let {match, routes} = this.props;
        return (
            <div>
                <div className="content">
                    <div className="left">
                    
                        <Link to={`${match.url}`}>个人中心</Link>
                        <br/>
                        <Link to={`${match.url}/info`}>用户信息</Link>
                    </div>
                    <div className="right">
                    {
//routes对子路由遍历
                       routes.map(({path, componentName, exact = true},key) => {
                            return <Route 
                                        exact={exact}
                                        key={key} 
                                        path={path} 
                                        component={componentName}
                                        />
                        })
                    }
                        
                    </div>
                
                </div>
                
            </div>
        );
    }
}

export default User;

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!