react动态路由组件的封装

news/2024/7/15 19:18:04 标签: react.js, javascript, 前端

react动态路由组件的封装

我这篇比较全面
首先下载包
npm i react-router-dom@5

这里为什么要用5的版本为啥不用最新的,原因在于老版本跟新版本写法不一样

老版本

import { HashRouter, Route, Switch, Redirect } from 'react-router-dom';
 render() {
    return (
      <HashRouter>
          <Switch>
            <Route exact path="/home" component={Home} />
          </Switch>
      </HashRouter>
    )
  }

新版本

import { HashRouter, Route, Routes, Navigate} from 'react-router-dom';
 render() {
    return (
      <HashRouter>
          <Routes>
             <Route path="/login" element={<Login/>}></Route>
          </Routes>
      </HashRouter>
    )
  }

区别 以前是用Switch包裹现在用的是Routes 以前 组件是component=函数名,现在要写成组件形式并且是element=<组件名/>,以前重定向Redirect ,现在Navigate

了解以上这些 我们这里开始封装一些组件

这里我讲解两种方式

第一种异步加载路由

1.首先创建一个异步加载路由函数
asyncComponent.js

import React from "react";
export default function asyncComponent(importComponent) {
    class AsyncComponent extends React.Component {
        constructor(props) {
            super(props);
            this.state = {
                component: null
            };
        }
        async componentDidMount() {
            const { default: component } = await importComponent();
            this.setState({ component });
        }

        render() {            
            const Component = this.state.component;
            return Component ? <Component {...this.props} /> : null;
        }
    }

    return AsyncComponent;
}

2.创建路由容器文件
map.js

import asyncComponent from "./until/asyncComponent"; //引入刚才的函数
export default [
    {
        path: "/home",
        component: asyncComponent(() =>
            import(
          /* webpackChunkName: "modules/digitalVillage/index" */ "../views/home/index"
            )
        )
    },
    {
        path: "/CodeScan/houseCode",
        component: asyncComponent(() =>
            import(
          /* webpackChunkName: "modules/digitalVillage/index" */ "../views/myself/index"
            )
        )
    },
]

3.创建视图路由文件
touterView.js


//这里用的5点几版本  由于最新的里面要传组件 我传过去了但是没显示,有兴趣的可以去试一下最新的路由方式
import React from 'react';
import { HashRouter, Route, Switch, Redirect } from 'react-router-dom';
//这里定义重定向跟普通函数跳转
export const routeCreate = (props) => {  
  return { type: 'Route', props };
};
export const redirectCreate = (props) => {
  return { type: 'Redirect', props };
};
//最终返回的路由
export default class extends React.Component {
  renderItem = (item, index) => {
    let Component = null;
    const { type, props } = item;
    if (type === 'Route') {
      Component = Route;
    } else if (type === 'Redirect') {
      Component = Redirect;
    }
    return Component ? (
      <Component key={index} {...props} />
    ) : null;
  };


  componentDidCatch(error, info) {
    console.error(error);
    console.log(info);
  }

  render() {
    const { data } = this.props;
    return (
      <HashRouter>
          <Switch>
            {data.map((item, index) => this.renderItem(item, index))}
          </Switch>
      </HashRouter>
    )
  }
}

4.创建路由中间件
index.js

import React from 'react';
import RouterView, { routeCreate, redirectCreate } from './until/routerView';
import routerMap from './map';
//
const routerData = [
  redirectCreate({ from: '/', to: '/CodeScan/houseCode', exact: true }),//重定向页
  ...routerMap.map(routeCreate)
];
export default class extends React.Component {
  render() {
    return (
      <RouterView data={routerData} />
    );
  }
}

最终在app里面加载就好了
在这里插入图片描述

第二种方式路由的懒加载

1.创建一个懒加载lazy函数
npm i react-loadable

import React from 'react'
import Loadable from 'react-loadable';
import loadCom from "../../views/load" //懒加载等待页面自己定义
//过场组件默认采用通用的,若传入了loading,则采用传入的过场组件
export default (loader, loading = loadCom) => {
    return Loadable({
        loader,
        loading
    });
}

2.mapjs 路由容器

 import loadable from './until/loadLazy'
 export default [
     {
         path: "/home",
         component: loadable(() => import('../views/home'))
     },
 ]

3.视图路由跟路由中间件是一样的

以上就是路由懒加载跟异步的封装


http://www.niftyadmin.cn/n/119712.html

相关文章

数据结构刷题(十七):530二叉搜索树最小绝对差、501二叉搜索树中的众数、236二叉树的最近公共祖先、235二叉搜索树的最近公共祖先

一、二叉搜索树的最小绝对差题目链接思路&#xff1a; 中序遍历保留为list for循环找最小绝对差二叉搜索树中序遍历后是有序的数组&#xff01;&#xff01;注意&#xff1a;i 1开始遍历解法&#xff1a;public int getMinimumDifference(TreeNode root) {List<Integer>…

使用 JaCoCo 生成测试覆盖率报告

0、为什么要生成测试覆盖率报告 在我们实际的工作中&#xff0c;当完成程序的开发后&#xff0c;需要提交给测试人员进行测试&#xff0c;经过测试人员测试后&#xff0c;代码才能上线到生产环境。 有个问题是&#xff1a;怎么能证明程序得到了充分的测试&#xff0c;程序中所…

git常用基本操作

克隆远程代码更新本地代码 git clone <-b | -branch> [branch name] [repository URL] git pull #拉取远程仓库代码&#xff0c;更新本地仓库 git merge <branch-name> #合并目标分支 建立本地仓库分支 git branch #查看当…

CS5261typec转HDMI|CS5260typec转VGA视频转换方案参考设计与PCB板开发

CS5261typec转HDMI|CS5260typec转VGA视频转换方案参考设计与PCB板开发 CS5261 CS5260分别是Type-C转HDMI或者VGA高性能 视频转换芯片&#xff0c;CS5261 是Type-C转HDMI 4K30HZ转换芯片 CS5260是Type-C转VGA 转换芯片。CS5261与CS5260两种芯片的功能和参数特性如下&#xff1…

经典分类模型回顾3-AlexNet实现图像分类(matlab版)

AlexNet是一种深度卷积神经网络&#xff0c;用于识别图像中的物体。它是由Alex Krizhevsky&#xff0c;Ilya Sutskever和Geoffrey Hinton在2012年提出的。它在ImageNet图像识别竞赛中获得了第一名。 在MATLAB中&#xff0c;可以使用Deep Learning Toolbox实现AlexNet进行图像分…

【C++】string的成员函数、成员常量和非成员函数

目录 string 1. string的成员函数 1.1 构造、析构和赋值运算符重载 1.1.1 构造函数 1.1.2 析构函数 1.1.3 赋值运算符重载 1.2 迭代器 1.3 容量 1.4 元素访问 1.4.1 遍历方法 1.5 修改器 1.6 字符串操作 2. string的成员常量 3. string的非成员函数 string 以下…

Tesseract(图文识别)使用中的问题点

1、升级tess4j版本后&#xff0c;发现执行instance.doOCR()方法异常&#xff1a; java.lang.UnsatisfiedLinkError: 找不到指定的模块 解决方法&#xff1a;这个问题是tess4j版本升级后&#xff0c;它相关的依赖也需要一并升级到相应版本&#xff0c;如jna、 lept4j等依赖

LeetCode 236.二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以是它自己的祖…