Ant Design Pro---【02 UMI路由讲解】

news2025/1/16 15:05:35

在 Umi 中,应用都是单页应用,页面地址的跳转都是在浏览器端完成的,不会重新请求服务端获取 html,html 只在应用初始化时加载一次。所有页面由不同的组件构成,页面的切换其实就是不同组件的切换,你只需要在配置中把不同的路由路径和对应的组件关联上。

配置路由

在配置文件中通过 routes 进行配置,格式为路由信息的数组。

比如:

export default {
  routes: [
    { exact: true, path: '/', component: 'index' },
    { exact: true, path: '/user', component: 'user' },
  ],
}

path

Type: string
配置可以被 path-to-regexp@^1.7.0 理解的路径通配符。

实际操作:

新建文件夹User以及页面index.tsx

/**
 * User页面
 */
const Index = () => {
  return (
    <div>
      <h1>User</h1>
    </div>
  )
}
export default Index

路由routes.ts修改

export default [
    { exact:true,path: '/', component: '@/pages/index' },
    { exact:true,path: '/user', component: '@/pages/user/index' },
  ];

页面显示
在这里插入图片描述

component

Type: string
配置 location 和 path 匹配后用于渲染的 React 组件路径。可以是绝对路径,也可以是相对路径,如果是相对路径,会从 src/pages 开始找起。

如果指向 src 目录的文件,可以用 @,也可以用 …/。比如 component: ‘@/layouts/basic’,或者 component: ‘…/layouts/basic’,推荐用前者。

实际操作:

新建文件夹layouts以及布局BasicLayout.tsx

import React,{ReactNode} from 'react'
interface IProps {
  children: ReactNode
}
//写法一
// function BasicLayout(props: IProps) {
//   return (
//     <div>
//      {props?.children}
//     </div>
//   )
// }

//写法二
function BasicLayout({children}: IProps) {
  return (
    <div style={{color:"red"}}>
      {children}
      BasicLayout
    </div>
  )
}
export default BasicLayout

路由routes.ts修改

export default [
    { exact:true,path: '/', component: '@/pages/index' },
    {
      path: '/',
      component: '@/layouts/BasicLayout',
      routes: [
        {path: '/user',exact: false,component: '@/pages/user/index'}
      ]
    }
]

页面展示
在这里插入图片描述

exact

Type: boolean
Default: true
表示是否严格匹配,即 location 是否和 path 完全对应上。

比如:

export default {
  routes: [
    // url 为 /one/two 时匹配失败
    { path: '/one', exact: true },
    
    // url 为 /one/two 时匹配成功
    { path: '/one' },
    { path: '/one', exact: false },
  ],
}

routes

配置子路由,通常在需要为多个路径增加 layout 组件时使用。

比如:

export default {
  routes: [
    { path: '/login', component: 'login' },
    {
      path: '/',
      component: '@/layouts/index',
      routes: [
        { path: '/list', component: 'list' },
        { path: '/admin', component: 'admin' },
      ],
    }, 
  ],
}

然后在 src/layouts/index 中通过 props.children 渲染子路由,

export default (props) => {
  return <div style={{ padding: 20 }}>{ props.children }</div>;
}
这样,访问 /list 和 /admin 就会带上 src/layouts/index 这个 layout 组件。

redirect

Type: string
配置路由跳转。

比如:

export default {
  routes: [
    { exact: true, path: '/', redirect: '/list' },
    { exact: true, path: '/list', component: 'list' },
  ],
}

访问 / 会跳转到 /list,并由 src/pages/list 文件进行渲染。

wrappers

Type: string[]
配置路由的高阶组件封装。

比如,可以用于路由级别的权限校验:

export default {
  routes: [
    { path: '/user', component: 'user',
      wrappers: [
        '@/wrappers/auth',
      ],
    },
    { path: '/login', component: 'login' },
  ]
}

然后在 src/wrappers/auth 中,

import { Redirect } from 'umi'

export default (props) => {
  const { isLogin } = useAuth();
  if (isLogin) {
    return <div>{ props.children }</div>;
  } else {
    return <Redirect to="/login" />;
  }
}

这样,访问 /user,就通过 useAuth 做权限校验,如果通过,渲染 src/pages/user,否则跳转到 /login,由 src/pages/login 进行渲染。

title

Type: string
配置路由的标题。

页面跳转

import { history } from 'umi';

// 跳转到指定路由
history.push('/list');

// 带参数跳转到指定路由
history.push('/list?a=b');
history.push({
  pathname: '/list',
  query: {
    a: 'b',
  },
});

// 跳转到上一个路由
history.goBack();

实际操作:

在User/index.tsx加入跳转按钮

import {Button} from "antd";
import {useHistory} from "umi";
/**
 * User页面
 */
const Index = () => {
  const history = useHistory()
  return (
    <div>
      <Button type="primary" onClick={()=>history.push('userInfo')}>goToUserInfo</Button>
      <h1>User</h1>
    </div>
  )
}
export default Index

在这里插入图片描述

hash 路由

详见 配置#history。

Link 组件

比如:

import { Link } from 'umi';

export default () => (
  <div>
    <Link to="/users">Users Page</Link>
  </div>
);

然后点击 Users Page 就会跳转到 /users 地址。

注意:

Link 只用于单页应用的内部跳转,如果是外部地址跳转请使用 a 标签

路由组件参数

路由组件可通过 props 获取到以下属性,

  • match,当前路由和 url match 后的对象,包含 params、path、url 和 isExact 属性
  • location,表示应用当前处于哪个位置,包含 pathname、search、query 等属性 history,同
    api#history 接口
  • route,当前路由配置,包含 path、exact、component、routes 等
  • routes,全部路由信息

比如:

export default function(props) {
  console.log(props.route);
  return <div>Home Page</div>;
}

传递参数给子路由

通过 cloneElement,一次就好(Umi 2 时需要两次)。

import React from 'react';

export default function Layout(props) {
  return React.Children.map(props.children, child => {
    return React.cloneElement(child, { foo: 'bar' });
  });
}

测试:

新建文件夹User以及页面index.tsx
在这里插入图片描述

/**
 * User/index.tsx
 * User页面
 */
const Index = () => {
  return (
    <div>
      <h1>User</h1>
    </div>
  )
}
export default Index

路由routes.ts修改

export default [
    { exact:true,path: '/', component: '@/pages/index' },
    { exact:true,path: '/user', component: '@/pages/user/index' },
  ];

页面显示
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/491273.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式——观察者模式(应用广,较难)

是什么&#xff1f; 又被称为发布-订阅模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者同时监听某一个主题对象&#xff0c;这个主题对象在状态变化时&#xff0c;会通知所有的观察者对象&#xff0c;使它们能够更新自己&#xff1b; 结构 抽象主题&…

复兴号列车司机室

复兴号上线有一段时间了&#xff0c;很多旅客都已经体验过&#xff0c;但是&#xff0c;司机室可能绝大多数人都没有机会一睹容颜&#xff0c;今天带你去司机室操纵台去探索一番。 按照上图的圈圈划分为操作台右侧&#xff08;蓝色圈圈&#xff09;、中部&#xff08;红色圈圈…

从C到C++

目录 1、输入输出库与名字空间 2、输入输出流对象cin和cout 3、string字符串类 4、bool类型 5、自增自减--运算符&#xff08;必考&#xff09; 6、其他 1、输入输出库与名字空间 #include <iostream> using namespace std; 每次写代码先把这两个东西加上 <io…

共享内存实现进程间大数据的交换

引言   进程间的数据交换和共享是一种非常重要和实用的技术。大、中型软件的开发设计多是由众多程序设计人员的合作完成&#xff0c;通常一个程序设计人员只负责其中一个或几个模块的开发&#xff0c;这些模块可以是动态链接库也可以是应用程序或是其他形式的程序组件。这些独…

Java 面试必问的线程池原理总结

本文首发自「慕课网」&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"&#xff01; 作者&#xff1a;大能老师 | 慕课网讲师 Java 线程池原理总结 &#xff08;一&#xff09;什么是线程池 线程池做的工作主要是控制运行…

Arcgis进阶篇(4)——arcgis js api使用geoserver服务

1、geoserver安装方法 geoserver-2.19.x&#xff08;此版本支持jdk8.x&#xff09;的下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1PkmmjHWWzbUA9fYfa110Ew?pwd8tvf 提取码&#xff1a;8tvf 经测试&#xff0c;最新版本的geoserver需要jdk11&#xff…

elasticsearch 使用的基础工具包及配置安装信息

前言:elasticsearch 工具在查询大量数据上面有明显的优势&#xff0c;但是具体的使用门槛相对较高&#xff0c;具体使用中不同版本使用上还有些差别&#xff0c;需要匹配上 spring boot elasticsearch 版本才能少出错 使用到的工具包&#xff0c;注意具体的版本 elasticsearc…

坚持伙伴优先,共创数据存储新生态

4 月 26 日&#xff0c;2023 阿里云合作伙伴大会上&#xff0c;阿里巴巴集团董事会主席兼 CEO、阿里云智能集团 CEO 张勇表示&#xff0c;阿里云的核心定位是一家云计算产品公司&#xff0c;生态是阿里云的根基。让被集成说到做到的核心&#xff0c;是要坚定走向“产品被集成”…

linux0.12-8-4-sys_call.s

[301页] 8-4 sys_call.s 程序 sys_call.s 程序简单总结&#xff1a; int 0x80 – _system_call int16 – 处理器错误中断 int7 – 设备不存在或协处理器不存在。 int32 – (int 0x20)时钟中断处理程序。 两个系统功能的底层接口&#xff0c;分别是 sys_execve 和 sys_fork 。…

​Prometheus集群编队开发套件升级上市

Prometheus集群编队开发套件是一个面向集群、多智能体相关研究方向的无人机二次开发平台&#xff0c;采用分布式集群算法。与传统无人机集群相比&#xff0c;分布式无人机集群更加灵活、可靠和高效&#xff0c;可应用于更加复杂及多样化的任务场景。 分布式集群科研平台&#x…

Linux 内存管理 pt.2

哈喽大家好我是咸鱼&#xff0c;在《Linux 内存管理 pt.1》中我们学习了什么是物理内存、虚拟内存&#xff0c;了解了内存映射、缺页异常等内容 那么今天我们来接着学习 Linux 内存管理中的多级页表和大页 多级页表&大页 在《Linux 内存管理 pt.1》中我们知道了内核为每…

【Vue】学习笔记-Vue CLI ref props mixin plugin scoped

ref 属性 ref被用来给元素或子组件注册引用信息(id的代替者) 应用在html标签上获取的真实的DOM元素&#xff0c;应用在组件标签上获取的组件实列对象vc使用方式 a. 打标识:或 b.获取&#xff1a;this.$refs.xxx <template><div><h1 v-text"msg" re…

MySQL 优化一MySQL优化步骤

目录 定位执行效率较低的 SQL 1&#xff09;慢查询 2&#xff09;processlist 定位执行效率较低的 SQL 定位执行效率比较慢的 SQL 语句&#xff0c;一般有三种方式 1、可以通过慢查询日志来定位哪些执行效率较低的 SQL 语句。 2、使用 show processlist 命令查看当前 MyS…

紧急下架,AI以假乱真学明星唱歌;哈佛法学院专家谈AI和版权法

几周前&#xff0c;一首据称由 Drake 和 The Weeknd 创作的新歌登陆 TikTok 和 Spotify&#xff0c;并迅速在互联网上像野火一样传播开来。“我袖子上的心”在嘻哈乐迷中获得了好评如潮和高度兴奋&#xff0c;这不仅是因为该曲目具有感染力的歌词和旋律&#xff0c;而且还因为对…

【云原生】云原生服务网格流量控制思考

文章目录 前言一、什么是流量控制&#xff1f;二、存在三种场景三、场景分析 前言 随着云原生技术的不断发展及应用&#xff0c;很多服务都已部署上云。 保障云上环境的稳定是重要的一环。 一个重要的影响稳定的场景就是突发大流量冲击。 面对该场景&#xff0c;较好的应对…

C#asp.net core学生信息管理系统

C#asp.net core学生信息管理系统 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net core架构和sql server数据库 功能模块&#xff1a; 首页登陆&#xff0c;分别为管理员&#xff08;学生管理 用户角色管理 授课信息管理&…

Linux_红帽8学习笔记分享_8(文件系统管理FS Management)

Linux_红帽8学习笔记分享_8&#xff08;文件系统管理FS Management&#xff09; 文章目录 Linux_红帽8学习笔记分享_8&#xff08;文件系统管理FS Management&#xff09;1.操作系统的两种启动模式: Legacy BIOS和UEFI1.1 Legacy BIOS1.2 UEFI 2.磁盘分区表的两种类型: MBR和GP…

【图像分割】【深度学习】SAM官方Pytorch代码-Mask decoder模块MaskDeco网络解析

【图像分割】【深度学习】SAM官方Pytorch代码-Mask decoder模块MaskDeco网络解析 Segment Anything&#xff1a;建立了迄今为止最大的分割数据集&#xff0c;在1100万张图像上有超过1亿个掩码&#xff0c;模型的设计和训练是灵活的&#xff0c;其重要的特点是Zero-shot(零样本迁…

ASP.NET动态Web开发技术第8章

第8章ASP.NET数据访问 一.预习笔记 1.SqlDataSource控件 SqlDataSource数据源控件支持连接SQL关系数据库&#xff0c;它使用SQL命令来检索和修改数据。通常将SqlDataSource数据源控件与数据绑定控件一起使用。 属性1&#xff1a;ID&#xff1a;当前数据源控件的唯一标识符 …

maven从入门到精通 第三章 Maven中形成web对Java工程的依赖

这里写自定义目录标题 一 war永远依赖于jar1. 在web工程的项目2中,加入项目1的路径依赖2 在web工程中&#xff0c;加入测试代码2.1 创建目录2.2 确认依赖junit2.3创建测试类2.4 运行测试2.5 打包2.6 查看依赖列表2.7 树形结构查看 二 测试依赖的范围1 compile的编译过程1.1 com…