react-router-dom 手写js渲染路由

react-router-dom 手写js渲染路由

笔者最近新搭建了一个项目,但是并没有使用市面上已经成熟的框架类似umi之类的,所以路由得自己手写。

项目目录如下:

根目录下的index.js文件是项目的入口文件。
在这里插入图片描述

根目录下的App.js文件是项目路由渲染的地方,其实也可以看成是项目的入口,代码如下:

函数renderRouter的作用是遍历路由的配置文件,把相应的路径和组件一一对应起来。

import './App.less';
import { BrowserRouter as Router, Route, Routes, Navigate } from 'react-router-dom';
import routers from "./routers";

function App() {

  function renderRouter(router, index) {
// 如果遇到子路由,则调用自身的函数遍历子路由
    if (router.children) {
      return (
          <Route path={router.path} element={router.component} key={index}>
            {router.children.map(item => renderRouter(item))}
          </Route>
      )
    }
// 如果遇到重定向,使用<Navigate to='' />直接跳转
    return <Route key={router.path} path={router.path} element={router.index ? <Navigate to={router.redirect}/> : router.component} index={router.index} />;
  }

  function renderRouterMap () {
    const ROUTE = routers.map((router, index) => renderRouter(router, index));
    return ROUTE;
  }

  return (
    <>
      <Router>
        <Routes>
          {
            renderRouterMap()
          }
        </Routes>
      </Router>
    </>
  );
}

export default App;

router文件的写法,代码仅供参考:

import Home from '@/pages/Home';
import Outpatient from '@/pages/Outpatient';
import PsychologicalTherapy from '@/pages/PsychologicalTherapy';
import MeasurementEvaluation from '@/pages/MeasurementEvaluation';
import EvaluationList from '@/pages/MeasurementEvaluation/EvaluationList';
import DoScale from '@/pages/MeasurementEvaluation/DoScale';
import ManMachinePsychotherapy from '@/pages/ManMachinePsychotherapy';
import MachinePsychotherapyList from '@/pages/ManMachinePsychotherapy/MachinePsychotherapyList';
import MachinePsychotherapyDetail from '@/pages/ManMachinePsychotherapy/MachinePsychotherapyDetail';
import HealthScience from '@/pages/HealthScience';
import MeasureClass from '@/pages/HealthScience/MeasureClass';
import MediationClass from '@/pages/HealthScience/MediationClass';
import HealthScienceArticle from '@/pages/HealthScience/HealthScienceArticle';
import OutpantientLayout from '@/components/outpantientLayout/layout';

const routes = [
  {
    path: 'home', 
    component: <Home />,
  },
  {
    path: '/',
    component: <OutpantientLayout />,
    children: [
      {
        index: true,
        redirect: 'home'
      },
      {
        path: 'outpatient',
        component: <Outpatient />,
      },
      {
        path: 'psychologicalTherapy',
        component: <PsychologicalTherapy />,
      },
      {
        path: 'measurementEvaluation',
        component: <MeasurementEvaluation />,
        children: [
          {
            index: true,
            redirect: 'list'
          },
          {
            path: 'list',
            component: <EvaluationList />,
          },
          {
            path: 'doScale',
            component: <DoScale />,
          },
        ]
      },
      {
        path: 'manMachinePsychotherapy',
        component: <ManMachinePsychotherapy />,
        children: [
          {
            index: true,
            redirect: 'list'
          },
          {
            path: 'list',
            component: <MachinePsychotherapyList />,
          },
          {
            path: 'detail',
            component: <MachinePsychotherapyDetail />,
          },
        ]
      },
      {
        path: 'healthScience',
        component: <HealthScience />,
        children: [
          {
            index: true,
            redirect: 'mediationClass',
          },
          {
            path: 'mediationClass',
            component: <MediationClass />,
          },
          {
            path: 'measureClass',
            component: <MeasureClass />,
          },
          {
            path: 'articleDetail',
            component: <HealthScienceArticle />,
          }
        ]
      },
    ]
  }
];

export default routes;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React Router是一个用于构建单页面应用程序的库。它提供了一种在React应用程序中管理路由的方式。React Router DOM是React Router的一个扩展,用于在Web应用程序中进行路由React Router DOM 5和React Router DOM 6之间有几个重要的区别: 1. 安装方式:React Router DOM 5使用npm包管理器进行安装,命令为`npm install react-router-dom`。而React Router DOM 6使用yarn进行安装,命令为`yarn add react-router-dom@next`。 2. 路由组件:在React Router DOM 5中,使用`<Route>`组件来定义路由。而在React Router DOM 6中,使用`<Route>`组件的替代方案`<Routes>`来定义路由。 3. 路由匹配方式:React Router DOM 5使用基于路径的匹配方式来确定哪个路由应该被渲染。而React Router DOM 6引入了新的匹配方式,称为元素匹配(element matching),它可以根据组件的类型来匹配路由。 4. 嵌套路由:在React Router DOM 5中,嵌套路由需要使用嵌套的`<Route>`组件来定义。而在React Router DOM 6中,可以使用嵌套的`<Routes>`组件来定义嵌套路由。 5. 动态路由:在React Router DOM 5中,可以通过在路径中使用参数来定义动态路由。而在React Router DOM 6中,可以使用`<Route>`组件的新属性`element`来定义动态路由。 6. 错误处理:React Router DOM 5使用`<Switch>`组件来处理路由匹配错误。而React Router DOM 6使用`<Routes>`组件的新属性`fallback`来处理路由匹配错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值