react 路由配置

这是一套路由配置使用的方案展示,若有不详细明确的地方/或者缺陷可以留言提醒
这里用到了mobx,可以不用理会无关代码
在这里插入图片描述
1.module
里面是根据项目板块划分的路由承载文件,提取一个文件作为示例
curriculum.js

import {loading} from "../config.js"; //自定义加载过程
import Loadable from 'react-loadable';//懒加载

//课程管理
export default [{
    path: '/main/curriculum',
    exact: false,
    label: "课程管理",
    name: 'curriculum', 
    component: Loadable({
        loader: () => import("../../page/curriculum/index.jsx"),
        loading
    }),
    meta: {
        show:true
    },children: [
        {
            path: '/main/curriculum/list',
            exact: true, //默认显示子路由
            label: "课程列表",
            name: 'curriculumList',
            component: Loadable({
                loader: () => import("../../page/curriculum/list/index.jsx"),
                loading
            }),
            meta: {
                icon: "iconkechengliebiao",//用于菜单栏展示的icon
                show:true //是否需要显示到菜单导航
            },
            //自定义当前组件的按钮权限,配合使用,关于组件权限后面会有
             btn: [{
                            label: '绑定站点',
                            value: "bind"
                        },
                        {
                            label: '编辑',
                            value: "update"
                        },
                        {
                            label: '新增管理员',
                            value: "addAdmin"
                        },
                    ]
        },]
        }]

2.config.js//懒加载的加载组件

import React from "react";
import {
	LoadingOutlined
} from "@ant-design/icons";


export  const loading = () => {
    return (
        <div className="pageLoading">
            <LoadingOutlined></LoadingOutlined>加载中...
        </div>
    );
}

3.index.js

import Loadable from 'react-loadable';
import {
    loading
} from "./config.js";
import curriculum from "./module/curriculum.js";
import merchandise from "./module/merchandise.js";
import public_class from "./module/public_class.js";
import user from "./module/user.js";
import website from "./module/website.js";
import other from "./module/other.js";
import home from "./module/home.js";

//子页面集合
const mainChilrend = [ ...home,...curriculum, ...merchandise, ...public_class, ...user, ...website, ...other]
export default [{
        path: '/',
        exact: true,
        name: 'login',
        component: Loadable({
            loader: () => import('../page/login/login.jsx'),
            loading
        }),
        meta: {
            login: false
        }
    },
    {
        path: '/main',
        exact: false,
        name: 'main',
        component: Loadable({
            loader: () => import("../page/main/main.jsx"),
            loading
        }),
        meta: {
            login: false
        },
        children: [
            ...mainChilrend
            
        ]
    }
]

这样主要的路由配置做好了,下面是使用这些配置
App.js 渲染组件,这里是不包含权限

import React from 'react';
import  'antd/dist/antd.css';
import { HashRouter  as Router, Route ,Switch } from "react-router-dom";
import routeMain from "./router/index";
// 在需要用到的 组件文件中引入中文语言包
import zhCN from 'antd/es/locale/zh_CN.js'; 
import {ConfigProvider} from "antd";

const AppContext = React.createContext({});
class App extends React.Component{

    //路由
    renderComponent(){
       return routeMain.map((item,index)=>{
            return (
                <Route key={index} path={item.path} exact={item.exact} 
                render={
                    props=>{
                        return <item.component {...props} route={item} />
                    }
                }>
                </Route>
            );
        })
    }
     
    render(){
        return(
            <AppContext.Provider value={{
                active:'0'
            }}>
            <div>
                <Router>
                <Switch>
                    <ConfigProvider locale={zhCN}>
                    {this.renderComponent()}
                    </ConfigProvider>
                   
                </Switch>
                </Router>
            </div>
            </AppContext.Provider>
        )
    }
    
}
export default App;

在这里插入图片描述
权限举例图中的index.jsx

import React from "react";
import { HashRouter as Router, Route, Switch } from "react-router-dom";
import mainChilrend from "../../router/module/curriculum.js";
import { observer, inject } from "mobx-react";
import NonePower from "../../component/none_power/index.jsx";//无权限提示组件
const routeList = mainChilrend[0].children;

@inject("commStore")
@observer
class App extends React.Component {
	// 路由拦截
	interceptRouter(item, props) {
		let menuList = this.props.commStore.menuList;//这里是之前在后端获取到的菜单列表,表示当前账号有权访问的菜单
		// 剔除在权限中的菜单-实现权限控制-路由跳转时发现没权限就会自动渲染无权提示页面NonePower
		if (menuList[item.name]) {
			return <item.component {...props} route={item} />;
		} else {
			return <NonePower></NonePower>;
		}
	}
	//路由
	renderComponent() {
		return routeList.map((item, index) => {
			return (
				<Route
					key={index}
					path={item.path}
					exact={item.exact}
					render={(props) => {
						return this.interceptRouter(item, props);
					}}
				></Route>
			);
		});
	}

	render() {
		return (
			<Router>
				<Switch>{this.renderComponent()}</Switch>
			</Router>
		);
	}
}
export default App;

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值