React中路由组件及路由表(优化react-router-dom)

本文介绍了如何使用React Router在应用中实现RouterConfig.js中的路由配置,包括一级和二级路由,以及如何在RouterView组件中动态渲染和处理权限。重点讲解了重定向、路由映射和组件加载的逻辑。
摘要由CSDN通过智能技术生成

路由表文件 RouterConfig.js

import Home from '../pages/Home'
import Login from '../pages/Login'
import Detail from '../pages/Detail'

// 二级路由
import Classify from '../pages/home/Classify'
import Car from '../pages/home/Car'
import My from '../pages/home/My'
import Vip from '../pages/home/Vip'


export default [
    {
        from: "/",
        to: "/home"
    },
    {
        path: "/home",
        com: Home,
        children: [
            {
                from: "/home",
                to: "/home/classify"
            },
            {
                path: "/home/classify",
                com: Classify,
                title: "分类"
            },
            {
                path: "/home/car",
                com: Car,
                title: "购物车"
            },
            {
                path: "/home/my",
                com: My,
                title: "我的"
            },
            {
                path: "/home/vip",
                com: Vip,
                auth: true,
                title: "vip"
            }
        ]
    },
    {
        path: "/login",
        com: Login
    },
    {
        path: "/detail",
        com: Detail
    }
]

路由组件 RouterView.jsx

import React, { Component } from 'react'
import { Route, Redirect, Switch } from 'react-router-dom'

export default class RouterView extends Component {
    render() {
        const { routerList } = this.props
        // 过滤出重定向的数据
        let RedirectList = routerList.filter(item => item.to)
        // 过滤出展示视图的数据
        let List = routerList.filter(item => !item.to)
        return (
            <React.Fragment>
                <Switch>
                {
                    List.map((item, index) => {
                        return <Route path = { item.path } render = {() => {
                            let Com = item.com
                            // 判断是否需要拦截
                            if (item.auth && !sessionStorage.getItem('token')) {
                                // to = ""  to = {}
                                return <Redirect to={{
                                    pathname: "/login",
                                    from: item.path
                                }}/>
                            }

                            // 判断是否要传递children
                            if (item.children) {
                                return <Com children = { item.children }/>
                            } else {
                                return <Com/>
                            }
                            
                        }} key = { index }/>
                    })
                }
                {/* 重定向的 */}
                {
                    RedirectList.map((item, index) => {
                        return <Redirect from = { item.from } to = { item.to } key = { index }/>
                    })
                }
                </Switch>
            </React.Fragment>
        )
    }
}

展示组件:

import RouterList from './RouterConfig'

<RouterView routerList = { RouterList }/>
<RouterView routerList = { this.props.children }/>
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值