Umi3 创建,配置环境,路由传参(代码示例)

目录

创建项目

配置环境

创建脚手架

项目结构及其目录、

路由

配置路由

嵌套路由

编程式导航和声明式导航

声明式导航

编程式导航

约定式路由

路由传参

query传参(问号)

接收参数

params传参(动态传参)

接收参数


创建项目

配置环境

首先得有 node,并确保 node 版本是 10.13 或以上。(18版本可能会不适配)

$ node -v  //查看版本
v16.20.2

如果出现版本错误,可以使用nvm进行node版本管理https://blog.csdn.net/kkkys_kkk/article/details/135071784?spm=1001.2014.3001.5501

推荐使用 yarn 管理 npm 依赖,并使用国内源(阿里用户使用内网源)。

# 国内源
$ npm i yarn tyarn -g
# 后面文档里的 yarn 换成 tyarn
$ tyarn -v

# 阿里内网源
$ tnpm i yarn @ali/yarn -g
# 后面文档里的 yarn 换成 ayarn
$ ayarn -v

创建脚手架

 创建项目文件夹

$ mkdir myapp && cd myapp

通过官方工具创建项目,

$ yarn create @umijs/umi-app
# 或 npx @umijs/create-umi-app

Copy:  .editorconfig
Write: .gitignore
Copy:  .prettierignore
Copy:  .prettierrc
Write: .umirc.ts
Copy:  mock/.gitkeep
Write: package.json
Copy:  README.md
Copy:  src/pages/index.less
Copy:  src/pages/index.tsx
Copy:  tsconfig.json
Copy:  typings.d.ts

安装依赖

$ yarn
或者
$ npm i

启动项目

$ yarn start
或者
$ npm start

在浏览器里打开 http://localhost:8000/,能看到以下界面

项目结构及其目录、


├── package.json   项目基本信息 、依赖信息
├── tsconfig.json  ts的配置文件
├── typings.d.ts   ts的类型声明文件(凡是以xxx.d.ts结尾的文件都是咱们的ts类型声明文件)
├── .umirc.ts      核心配置文件
├── .env           环境参数文件
├── mock           mock数据
├── src
		├── .umi       编译后自动生成的文件,不需要动
		├── pages               业务组件文件夹(页面)
		├── index.less
		└── index.tsx       业务组件

路由

umi的路由分为配置路由与约定路由

配置路由

在`pages`中新建一个页面

export default function Home() {
  return (
  <div>Home</div>
  )
}

在.umirc.ts中的routes配置项中新增路由配置

import { defineConfig } from 'umi';
export default defineConfig({
  nodeModulesTransform: {
  	type: 'none',
  },
  routes: [
  	{
      path: '/home',
      component: '@/pages/Home'
    },
    {
      path: '/course',
      component: '@/pages/Course'
    }
  ],
  fastRefresh: {},
});

umi官方推荐我们使用config方法

在项目文件下创建config文件夹,复制umirc.ts内容,同时删除umirc.ts文件,因为umirc.ts的权重高

创建config文件,粘贴umirc.ts,将routes作为文件导入引入

import { defineConfig } from 'umi';
import routes from './router/index';

export default defineConfig({
  nodeModulesTransform: {
    type: 'none',
  },
  
  fastRefresh: {},
  routes
});

创建路由文件,声明路由,导出

const routes=[
  	{
      path: '/home',
      component: '@/pages/Home'
    },
    {
      path: '/course',
      component: '@/pages/Course'
    }
  ],
export default routes
嵌套路由

嵌套路由是通过`routes`属性来实现的

 const routes=[

{
        path:'/index',
        component:'@/pages/Base/Base',
        routes:[
            {
                path:'one',
                component:'@/pages/One/One'
            },
            {path:'two',component:'@/pages/Two/Two'},
            {path:'three',component:'@/pages/Three/Three'},
        ]
    },
]

然后在组件中通过props.children来渲染子路由

import React from 'react';
import styles from './index.less';

export default (props:any) => {
  return (
    <div className={ styles['container'] }>
      { props.children }
    </div>
  )
}
编程式导航和声明式导航
声明式导航
import React from 'react';
import styles from './index.less';
import { NavLink } from 'umi';

// 通过接口定义props类型
interface Props {
  children: React.ReactNode
}
// 在umijs中,Props类型的定义一般会用到React.FC类型,FunctionComponent类型
// 在React.FC类型中,Props类型是一个泛型,用来定义组件所接收的Props类型
const Course:React.FC<Props> = (props) => {
  return (
    <div className={ styles['container'] }>
      {/* v5版本的路由是一样的 */}
      <NavLink to="/course" activeClassName="active">去课程</NavLink>
      Course <br />
      { props.children }
    </div>
  )
}

export default Course;
编程式导航

编程式导航是通过: history.push 方法来实现的

import styles  from './index.less';
import { NavLink, history } from 'umi';

export default function Home() {
  return (
    <div className={ styles['container'] }>
      Pages Home
      {/* 声明式导航 */}
      <NavLink to="/course" activeClassName="active">去课程</NavLink>
      {/* 编程式导航 */}
      <button onClick={ () => history.push('/course') }>去课程</button>
    </div>
  )
}

约定式路由

如果没有routes 配置 , Umi 会进入约定式路由模式, 然后分析src/pages 目录拿到路由配置。 比如以下文件结构:

└── pages
	├── index.tsx
  └── users.tsx

会得到以下路由配置

[
  { exact: true, path: '/', component: '@/pages/index' },
	{ exact: true, path: '/users', component: '@/pages/users' }
]

路由传参

query传参(问号)

写入路径中

history.push('/list?id=1');

以对象形式

history.push({
  pathname: '/list',
  query: {
    name: 'b',
  },
});
接收参数

使用history方法

import {history } from 'umi'

生成变量接收参数

 const id =history.location.search.split('=')[1]

 或者使用useLocation函数,返回表示当前 URL 的对象。您可以将其视为每当 URL 更改时返回新位置。

import { useLocation } from 'umi';

export default () => {
  const location = useLocation();
  return (
    <div>
      <ul>
        <li>location: {location.pathname}</li>
      </ul>
    </div>
  );
};
params传参(动态传参)

路由表配置改为动态

  {
        path:'/anthor/:id',
        component:'@/pages/detail/Id'
    },
    

同样使用history方法

  <button onClick={()=>{history.push('/anthor/1')}}>click me</button>

将需要传递的参数直接写入路径当中

接收参数

useParams返回 URL 参数的键/值对的对象。使用它来访问当前路由

import { useParams } from 'umi';

export default () => {
  const params = useParams();
  return (
    <div>
      <ul>
        <li>params: {JSON.stringify(params)}</li>
      </ul>
    </div>
  );
};

返回的是包含数据信息的对象

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android Text View 去掉默认的padding的实现方法

先看下最终实现效果&#xff0c;满意您在往下看&#xff1a; TextView 绘制的时候自带一定的Padding值&#xff0c;要想实现去掉默认的padding值&#xff0c;xml文件可以设置一个属性值 &#xff1a; android:includeFontPadding"false" 然后运行起来就会发现&…

【总结】Dinky学习笔记

概述 Dinky 是一个开箱即用、易扩展&#xff0c;以 Apache Flink 为基础&#xff0c;连接 OLAP 和数据湖等众多框架的一站式实时计算平台&#xff0c;致力于流批一体和湖仓一体的探索与实践 官网&#xff1a;Dinky 核心特性 沉浸式&#xff1a;提供专业的 DataStudio 功能&a…

喜好儿AI周报Weekly(第9期)CES2024 AI产业大爆发 | Rabbit R1 | 3D-Fauna | OLED屏幕 | Genie | MagicVideoV2 | Magnific

各位观众朋友们大家好&#xff01;我是被老板派去出差逛CES2024 拉斯维加斯消费电子展差点迷路回不来的阿喜。一起去看看这一周有什么新鲜事吧。 本期导读&#xff1a; 逛逛CES 2024消费电子展Rabbit R1人工智能设备三星AI机器人BallieLG无线透明OLED屏幕Portalgraph VR空间投…

【Linux】初识Linux及几个基本指令

Hello everybody!算算时间我已经有一个多月没有更新啦&#xff01;因为本专业是纺织工程&#xff0c;所以一直在复习应付期末考试\(0^◇^0)/。那好&#xff0c;废话不多说。让我们进入今天的主题&#xff01; 关于Linux系统可能很多同学不是很熟悉&#xff0c;有的人可能听过&…

4、C语言:指针与数组

数组与指针 指针与地址指针与函数参数指针与数组地址算数运算字符指针与函数指针数组以及指向指针的指针多维数组命令行参数指向函数的指针复杂声明 指针是一种保存变量地址的变量。C语言中&#xff0c;指针的使用非常广泛&#xff0c;原因之一是&#xff0c;指针常常是表达某个…

紫光展锐T610安卓核心板_虎贲T610安卓核心板参数

紫光展锐T610核心板是一款结构紧凑的4G智能模块&#xff0c;尺寸为52.5nm*38.5nm*2.9nm&#xff0c;适用于对产品结构尺寸要求较高的场合。该核心板搭载Android 11操作系统&#xff0c;采用12nm制程工艺&#xff0c;配备八核1.8GHz的CPU&#xff0c;包括2 x A751.8GHz 6 x A55…

20240115在ubuntu20.04.6下查看显卡信息

20240115在ubuntu20.04.6下查看显卡信息 2024/1/15 17:33 百度&#xff1a;ubuntu查看显卡型号命令 https://linux.xiaosiseo.com/post/6037.html#id4 Ubuntu查看显卡信息命令 小四LINUX7个月前 (05-22)Ubuntu3230 小四LINUX&#xff0c;是小四运营旗下网站&#xff0c;专注LIN…

excel管理接口测试用例

闲话休扯&#xff0c;上需求&#xff1a;自动读取、执行excel里面的接口测试用例&#xff0c;测试完成后&#xff0c;返回错误结果并发送邮件通知。 分析&#xff1a; 1、设计excel表格 2、读取excel表格 3、拼接url&#xff0c;发送请求 4、汇总错误结果、发送邮件 开始实现…

短视频IP运营流程架构SOP模板PPT

【干货资料持续更新&#xff0c;以防走丢】 短视频IP运营流程架构SOP模板PPT 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 抖音运营资料合集&#xff08;完整资料包含以下内容&#xff09; 目录 抖音15秒短视频剧本创作公式 在抖音这个短视频平台上&#…

QT报错记录

Ubuntu22.04安装Qt之后启动Qt Creator报错&#xff1a; Fron 6.5.0, xcb-cursor0 or libxcb-cursor0 is needed to load the Qt xcb platforn plugin. Could not load. This application failed to start because no Qt platforn plugin could be initialized. Reinstalling t…

OpenCV-Python(41):背景减除

目标 学习并掌握OpenCV中的背景减除方法 背景说明 在很多基础应用中背景检出都是一个非常重要的步骤。例如&#xff1a;顾客统计&#xff0c;使用一个静态摄像头来记录进入和离开房间的人数&#xff0c;或者是交通摄像头&#xff0c;需要提取交通工具的信息等。在所有的这些例…

QT day6

目录 思维导图 学生管理系统 思维导图 学生管理系统 ui界面 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QSqlDatabase> //数据库管理类 #include <QSqlQuery> //执行sql语句类 #include <QSqlRecord> //数据库记录类 …

【大模型 + 网络安全 】炒作内卷 or 革新升级?

一年前&#xff0c;ChatGPT问世&#xff0c;以强大的信息整合推理和语言对话能力惊艳全球&#xff0c;随后&#xff0c;以大语言模型LLM&#xff08;以下简称“大模型”&#xff09;为代表的AI技术应用全面席卷&#xff0c;赋能千行百业&#xff0c;重构业务流程&#xff0c;加…

Qt点击按钮在其附近弹出一个窗口

效果 FS_PopupWidget.h #ifndef FS_POPUPWIDGET_H #define FS_POPUPWIDGET_H#pragma once#include <QToolButton> #include <QWidgetAction> #include <QPointer>class QMenu;class FS_PopupWidget : public QToolButton {Q_OBJECTpublic:FS_PopupWidget(QW…

Android的setContentView流程

一.Activity里面的mWindow是啥 在ActivityThread的performLaunchActivity方法里面&#xff1a; private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {ActivityInfo aInfo r.activityInfo;if (r.packageInfo null) {r.packageInfo getP…

2024年甘肃省职业院校技能大赛信息安全管理与评估 样题一 模块二

竞赛需要完成三个阶段的任务&#xff0c;分别完成三个模块&#xff0c;总分共计 1000分。三个模块内容和分值分别是&#xff1a; 1.第一阶段&#xff1a;模块一 网络平台搭建与设备安全防护&#xff08;180 分钟&#xff0c;300 分&#xff09;。 2.第二阶段&#xff1a;模块二…

如何分析测试任务及需求(附分析流程)

测试分析 确认测试范围 根据测试项目的不同需求&#xff0c;有大致几类测试项目类型&#xff1a;商户/平台功能测试、支付方式接入测试、架构调整类测试、后台优化测试、性能测试、基本功能自动化测试。 测试项目需要按照文档要求进行测试需求分析&#xff0c;并给出对应的输出…

数据结构学习 jz66 构建乘积数组

关键词&#xff1a;数学 双指针 方法一&#xff1a;这个题目我一开始做不知道不能用除法。我做的&#xff1a;[ 用时: 12 m 12 s ] 用了除法 分类讨论 方法二&#xff1a;后来看了提示&#xff0c;双指针&#xff0c;两边各开始乘。 方法三&#xff1a;然后又看了答案可以节…

几款提高开发效率的Idea 插件

1、ignore 开发代码过程中经常会有一些需要提交到代码仓库的文件&#xff0c;比如java文件生成的.class、.jar 等&#xff0c;如果将编译后的文件都提交到代码库那么代码库会很大&#xff0c;关键是没有必要。 这款插件就可以很方便的解决某类文件或者某个文件夹不需要提交到…

OS进程管理

进程 文章目录 进程概念组成特征状态与转换组织方式链接方式索引方式 进程控制实现进程控制如何实现原语的“原子性” 进程通信(IPC)共享存储基于存储区共享基于数据结构的共享 消息传递直接通信方式间接通信方式 管道通信 线程实现方式用户级线程内核级线程 多线程模式状态与转…