React-Router-集中式管理

简介: React-Router-集中式管理

前言


React Router 是 React 应用程序中常用的路由管理库,用于处理页面导航和路由控制。集中式管理是一种在大型应用程序中更好地组织和管理路由的方法,它有助于维护应用的可扩展性和可维护性。




路由统一管理(路由集中管理)


现在虽然我们能通过路由实现组件切换, 但是现在我们的路由都比较分散, 不利于我们管理和维护,所以 React 也考虑到了这个问题, 也给我们提供了统一管理路由的方案。

官方文档:https://www.npmjs.com/package/react-router-config

首先需要安装插件:

npm install --save react-router-config


然后在创建一个 router 目录在该目录当中创建一个 index.js 当然你也可以不用像我这样,你也可以在某一处地方创建一个 JS 文件在该文件当中编写对应的路由映射配置文件内容即可,index.js 内容如下:

import Home from '../components/Home'
import About from '../components/About'
import Other from '../components/Other'
import User from '../components/User'
import Login from '../components/Login'
import Discover from '../components/Discover'
const routers = [
    {
        path: '/home',
        exact: true,
        component: Home
    },
    {
        path: '/about/:name/:age',
        exact: true,
        component: About
    },
    {
        path: '/user',
        exact: true,
        component: User
    },
    {
        path: '/login',
        exact: true,
        component: Login
    },
    {
        path: '/discover',
        exact: true,
        component: Discover
    },
    {
        component: Other
    },
];
export default routers;


更改 App.js 的一级路由:

import React from 'react';
import {NavLink, withRouter} from 'react-router-dom';
import {renderRoutes} from 'react-router-config';
import routers from './router/index';
class App extends React.PureComponent {
    render() {
        const obj = {
            name: 'yangbuyiya',
            age: 18,
            gender: 'man'
        };
        return (
            <div>
                <NavLink to={'/home?name=yangbuyiya&age=18'} activeStyle={{color: 'red'}}>Home</NavLink>
                <NavLink to={'/about/yangbuyiya/18'} activeStyle={{color: 'red'}}>About</NavLink>
                <NavLink to={{
                    pathname: '/user',
                    search: '',
                    hash: '',
                    state: obj
                }}
                         activeStyle={{color: 'red'}}
                >
                    User
                </NavLink>
                <NavLink to={'/discover'} activeStyle={{color: 'red'}}>广场</NavLink>
                <button onClick={() => {
                    this.btnClick()
                }}>
                    广场
                </button>
                {renderRoutes(routers)}
            </div>
        )
    }
    btnClick() {
        this.props.history.push('/discover');
    }
}
export default withRouter(App);

如上的更改主要内容为,就是把之前的 Route 去除了,利用了 react-router-config 当中的 renderRoutes 方法将我们编写的 routers 进行注册,然后我们的一级路由与对应的组件的关系就关联起来了。




嵌套路由


在博主对官方文档的阅读时发现,如果我们的路由有二级路由需要在一级路由当中在指定一下二级路由的规则,通过 routes 属性进行指定:

更改 router/index.js:

index.js:

import Home from '../components/Home'
import About from '../components/About'
import Other from '../components/Other'
import User from '../components/User'
import Login from '../components/Login'
import Discover, {Hot, TopList, PlayList} from '../components/Discover'
const routers = [
    {
        path: '/home',
        exact: true,
        component: Home
    },
    {
        path: '/about/:name/:age',
        exact: true,
        component: About
    },
    {
        path: '/user',
        exact: true,
        component: User
    },
    {
        path: '/login',
        exact: true,
        component: Login
    },
    {
        path: '/discover',
        component: Discover,
        routes: [
            {
                path: '/discover',
                exact: true,
                component: Hot,
            },
            {
                path: '/discover/toplist',
                exact: true,
                component: TopList,
            },
            {
                path: '/discover/playlist',
                exact: true,
                component: PlayList,
            },
        ]
    },
    {
        component: Other
    },
];
export default routers;

更改 Discover.js 将其他三个需要使用到的组件导出一下:

export function Hot() {
    return (
        <div>推荐</div>
    )
}
export function TopList() {
    return (
        <div>排行榜</div>
    )
}
export function PlayList() {
    return (
        <div>歌单</div>
    )
}


然后在嵌套路由的组件当中再次通过 renderRoutes 方法进行注册嵌套路由这里有个注意点,我们这里是需要注册的是一级路由当中的嵌套路由里面的 routes 的内容通过博主的计算发现它在 index.js 的索引为 4 然后我们的 Discover.js 的代码如下所示:

import React from 'react';
import {NavLink} from "react-router-dom";
import {renderRoutes} from 'react-router-config';
import routers from '../router/index';
export function Hot() {
    return (
        <div>推荐</div>
    )
}
export function TopList() {
    return (
        <div>排行榜</div>
    )
}
export function PlayList() {
    return (
        <div>歌单</div>
    )
}
class Discover extends React.PureComponent {
    render() {
        return (
            <div>
                <NavLink exact to={'/discover'} activeStyle={{color: 'red'}}>推荐</NavLink>
                <NavLink exact to={'/discover/toplist'} activeStyle={{color: 'red'}}>排行榜</NavLink>
                <NavLink exact to={'/discover/playlist'} activeStyle={{color: 'red'}}>歌单</NavLink>
                <button onClick={() => {
                    this.btnClick()
                }}>歌单
                </button>
                {
                    renderRoutes(routers[4].routes)
                }
            </div>
        )
    }
    btnClick() {
        this.props.history.push('/discover/playlist');
    }
}
export default Discover;

如上的 renderRoutes(routers[4].routes) 的写法是 2B 铅笔写法, 企业开发中千万不要这么写,如果当前组件是通过 renderRoutes 创建的, 那么系统过就会自动给这个组件传递一个 route 对象,然后我们可以根据这个 route 对象获取到嵌套路由的 routes 信息,然后推荐的写法和改造之后的代码如下:

{
    renderRoutes(this.props.route.routes)
}



最后

本期结束咱们下次再见👋~

🌊 关注我不迷路,如果本篇文章对你有所帮助,或者你有什么疑问,欢迎在评论区留言,我一般看到都会回复的。大家点赞支持一下哟~ 💗

相关文章
|
监控 安全 Java
【JavaWeb】 三大组件之过滤器 Filter
过滤器(Filter)是Java Web应用中的一种组件,它在请求到达Servlet或JSP之前或者响应送回客户端之前,对请求和响应进行预处理和后处理操作。通过使用过滤器,可以对请求进行过滤,拦截请求,修改请求参数,在请求被处理之前进行一些预处理操作;同时也可以对响应进行过滤,对响应内容进行修改,添加一些额外的处理。
|
缓存 监控 API
抖音抖店 API 请求获取宝贝详情数据的调用频率限制如何调整?
抖音抖店API请求获取宝贝详情数据的调用频率受限,需遵循平台规则。开发者可通过提升账号等级、申请更高配额、优化业务逻辑(如缓存数据、异步处理、批量请求)及监控调整等方式来应对。
|
9月前
|
前端开发
如何在React Router中进行路由重定向?
如何在React Router中进行路由重定向?
585 57
|
12月前
|
机器学习/深度学习 存储 人工智能
多模态、数据血缘、QA拆分、语音对话等特点解析
知识库问答拆分将文档内容转换为问答对,提高信息检索效率和用户体验,同时便于信息结构化和维护。数据血缘能力支持查看和维护知识来源,确保信息准确性。多模态知识库整合文本、图像等多种数据,提升信息检索质量和用户体验。语音对话功能支持音色选择、语音输入和播报,增强互动性。Rerank排序优化知识库召回结果,提升查询精准度。
304 8
|
移动开发 资源调度 前端开发
React Router V6 useRoutes的使用
【8月更文挑战第29天】 React Router V6 useRoutes的使用
595 3
|
安全 Java 数据库
Spring Security详细讲解(JWT+SpringSecurity登入案例)
通过本篇博文,你可以详细了解Spring Security的相关概念与原理,并且掌握Spring Security的认证与授权,通过博文中的登入案例可以让自己定制去Spring Security认证授权方案。
Spring Security详细讲解(JWT+SpringSecurity登入案例)
|
API 数据库 开发者
掌握数据完整性的关键:全面解析Entity Framework Core中的事务管理策略及其应用
【8月更文挑战第31天】在数据库操作中,确保数据完整性至关重要。Entity Framework Core(EF Core)作为一款强大的ORM工具,提供了丰富的API支持事务管理,帮助开发者实现数据的一致性和完整性。
217 0
|
安全 数据处理 C#
深入理解C#中的Span<T>和Memory<T>
【1月更文挑战第8天】本文旨在探讨C#中引入的两个重要类型:Span<T>和Memory<T>。它们为开发者提供了一种高效且安全的方式来处理内存中的数据。文章首先介绍这两个类型的基本概念和用途,接着深入分析它们的工作原理和适用场景,并通过代码示例展示如何在实际应用中使用它们。
|
缓存 前端开发 JavaScript
pdf.js预览pdf文件流(base64)
新接手一个老项目,需要改造pdf文件的预览效果,接口直接返回的pdf文件的文件流base64字符串,前端只能拿到base64来进行预览。 pdf.js是一款非常优秀的pdf解析工具,但不支持直接预览文件流,这里需要对pdf.js稍微改造。
1947 0
pdf.js预览pdf文件流(base64)
|
Web App开发 编解码 前端开发
vue 接入腾讯实时音视频 trtc-js-sdk 的技术难点与解决方案
1.低延迟,如果要满足比较流畅地进行实时互动,那么单向的端到端的迟延大概要在 400 毫秒以下才能保证流畅沟通; 2.流畅性,你也很难想象在视频过程中频繁卡顿会有良好的互动; 3.回声消除,回声的产生是扬声器播放的声音经过环境反射被麦克风重新采集并传输给对方,这样对方就会一直听到自己的回声,整个互动过程会非常难受; 4.国内外互通,随着现在国内同质化产品越来越多,国内的竞争也异常激烈,很多厂商纷纷选择出海,这时就需要做好海内外的互通; 5.海量并发,当然这不仅仅指实时音视频了,基本对于任何一款互联网产品而言都是必须要考虑的难点。
1262 0