zoukankan      html  css  js  c++  java
  • react嵌套路由

    1、结构目录

    2、路由配置文件,参照的vue-router

    config.js

    import Login from '../view/Login.js';
    import System from '../view/System.js';
    import Bus from '../view/Bus.js';
    import Bus22 from '../view/Bus22.js';
    
    const routes = [
      {
        path: "/",
        component: Login,
        exact: true,
      },
      {
        path: "/system",
        component: System,
        auth:true,
        routes: [
          {
            path: "/system/bus",
            component: Bus,
            exact: true,
            auth:true,
          },
          {
            path: "/system/bus22",
            component: Bus22,
            exact: true,
            auth:true,
          },
        ]
      }
    ];
    export default routes;

    3、路由主体,使用react-router-dom,详细文档里面也有其它的例子和API

    import routes from './config';
    import React, {Component} from 'react';
    import {
      BrowserRouter as Router,
      Switch,
      Route,
      Redirect,
    } from "react-router-dom";
    
    /*一级路由*/
    class First extends Component {
      render() {
        return (
          <Router>
            <Switch>
              {routes.map((route, i) => {
                  if (route.auth) {//根据配置是否检测登录
                    return (
                      <PrivateRoute key={i} path={route.path}>
                        <route.component/>
                      </PrivateRoute>
                    )
                  } else {
                    return (<RouteWithSubRoutes key={i} {...route} />)
                  }
                }
              )}
            </Switch>
          </Router>
        );
      }
    }
    /*二级路由*/
    class SystemRouter extends Component {
      render() {
        return (
            <Switch>
              {routes[1].routes.map((route, i) => {
                if (route.auth) {//根据配置是否检测登录
                  return (
                    <PrivateRoute  key={i} path={route.path}>
                      <route.component/>
                    </PrivateRoute>
                  )
                } else {
                  return (<RouteWithSubRoutes key={i} {...route} />)
                }
              })}
            </Switch>
        );
      }
    }
    
    export {
      First, SystemRouter
    };
    // A special wrapper for <Route> that knows how to
    // handle "sub"-routes by passing them in a `routes`
    // prop to the component it renders.
    /*开放路由*/
    function RouteWithSubRoutes(route) {
      return (
        <Route
          exact={route.exact}
          path={route.path}
          render={props => (
            // pass the sub-routes down to keep nesting
            <route.component {...props} routes={route.routes}/>
          )}
        />
      );
    }
    /*登录检测路由*/
    function PrivateRoute({children, ...rest}) {
      let isAuthenticated = sessionStorage.auth;
      return (
        <Route
          {...rest}
          render={({location}) =>
            isAuthenticated ? (
              children
            ) : (
              <Redirect
                to={{
                  pathname: "/",
                  state: {from: location}
                }}
              />
            )
          }
        />
      );
    }

    4、一级路由的使用,在App.js

    import React from 'react';
    import './App.css';
    import {First} from './router/index';
    
    function App() {
      return (
        <First/>
      );
    }
    
    export default App;

    5、二级路由的使用,在一级路由的组件文件中,本例是System.js

    import React,{Component} from 'react';
    import {SystemRouter} from '../router/index';
    import {
      withRouter
    } from "react-router-dom";
    import { Menu, Icon } from 'antd';
    
    const { SubMenu } = Menu;
    class System extends Component  {
      componentDidMount() {
    
      }
    
      handleClick = e => {
        this.props.history.push(e.key)
      };
      render() {
        return (
          <div>
            <header>
              嵌套路由
            </header>
            <Menu
              onClick={this.handleClick}
              style={{  256,float:'left' }}
              defaultSelectedKeys={['1']}
              defaultOpenKeys={['sub1']}
              mode="inline"
            >
              <SubMenu
                key="sub1"
                title={
                  <span>
                  <Icon type="mail" />
                  <span>Navigation One</span>
                </span>
                }
              >
                <Menu.Item key="/system/bus">bus</Menu.Item>
                <Menu.Item key="/system/bus22">bus22</Menu.Item>
              </SubMenu>
          
            </Menu>
            <SystemRouter  style={{ float:'left' }}/>
          </div>
        );
      }
    }
    export default withRouter(System);

    最后来俩效果图,页面分三部分,头部、左侧导航、右侧内容,切换时只有右侧内容变化。

  • 相关阅读:
    HDU 4472 Count DP题
    HDU 1878 欧拉回路 图论
    CSUST 1503 ZZ买衣服
    HDU 2085 核反应堆
    HDU 1029 Ignatius and the Princess IV
    UVa 11462 Age Sort
    UVa 11384
    UVa 11210
    LA 3401
    解决学一会儿累了的问题
  • 原文地址:https://www.cnblogs.com/gxp69/p/12711412.html
Copyright © 2011-2022 走看看