【umi-max】初识 antd pro

修改端口号

根目录下的 .env 文件:

PORT=8888

目录结构 (umijs.org)

新增页面

在 umirc.ts 中进行配置。

新增页面 - Ant Design Pro

这里有一个配置 icon:string,可以在菜单加 icon 图标,默认使用 antd 的 icon 名,默认不适用二级菜单的 icon,例如:icon:"QuestionCircleOutlined"

图标 Icon - Ant Design (antgroup.com)

二级菜单,也就是子路由。需要使用配置项 routes:[{}],类似于 vue-router 中的 children。

还有一个配置: hideInMenu:true 可以在菜单中不展示这个路由,包括子路由。例如登录、注册什么的。

menuRender: false 当前路由不展示菜单

代理

也是直接在 umirc.ts 中进行配置。

配置 (umijs.org)

ProComponents

antd pro 内置了 ProComponents。

https://procomponents.ant.design/docs

里面的组件是基于 antd 的二次封装,注意属性及内置方法和 antd 的相同点和差异。比如表格:

https://procomponents.ant.design/components/schema#valuetype-%E5%88%97%E8%A1%A8

表格 Table - Ant Design (antgroup.com)

其中 render 属性类似于插槽,可以在 table 里面插入各种组件。

设置全局 CSS

直接在 src 目录下创建 global.css 的文件,默认被配置为全局样式。目录结构 (umijs.org)

Form 回填数据

antd Form

image.png

关于发送请求获取数据

有两种处理方式:

  • 通过dispatch一个action到状态仓库,然后状态仓库来发请求,请求回来的数据放入到数据仓库中
    • 适用于数据量不多
    • 多个组件要共享某一块数据
  • 直接在组件里面请求数据
    • 数据量很大,在向服务器发送请求的时候,只能分页请求
    • 不需要和其他组件共享

说一下 ProTable 里面的 request:

https://procomponents.ant.design/components/table#request

ProTable有一个重要的属性叫做 request ,该属性对应的值一般是一个异步函数,该异步函数自动接受一个params,params中会有默认的当前页码(current)和每一页的条数(pageSiz2e)(当然还会捕获其他参数,可以自己手动log下),这两个值会有默认值,current默认为1,pageSize默认为20,可以通过配置pagination属性来修改current和pageSize的值。

此外,在查询表单查询时和 params 参数发生修改时 request 会重新执行,同时也会触发 onChange 等回调。

<ProTable// params 是需要自带的参数// 这个参数优先级更高,会覆盖查询表单的参数headerTitle="用户列表"columns={columns}  // antd table 需要的表头配置rowKey={row => row.id}  // 配置表格的行 keypagation={{showQuickJumper: true,showSizeChanger: true,pageSizeOptions: ['10', '20', '30', '40'],...pagation, // 这个参数是自定义的 state 用于响应式改变 current 和 pageSizeonChange: handlePageChange  // 自定义分页数据改变的回调 会自动传入两个参数 current 和 pageSize 需要自己手动更新到 state 中}}request={async (// 第一个参数 params 查询表单和 params 参数的结合 必填// 第一个参数中一定会有 pageSize 和  current ,这两个参数是 antd 的规范params,sort,filter,) => {// 这里需要返回一个 Promise,在返回之前你可以进行数据转化// 如果需要转化参数可以在这里进行修改const res = await myQuery({page: params.current,pageSize: params.pageSize,});return {// 返回当前页的数据数组data: res.data.data,// success 请返回 true,// 不然 table 会停止解析数据,即使有数据success: true,// 不传会使用 data 的长度,如果是分页一定要传// 数据总数total: res.data.total,};}}
/>

ref.current.reload(); 可以刷新 ProTable。

Warning:Cannot update a component InternalFormItem)while rendering a different component userForm) 该警告出现的原因,是因为在初次渲染组件的时候,我们设置了数据的回填,导致组件初次还没有渲染完毕,又在更新。如何解决,也非常简单,我们等待第一次渲染完毕后再进行数据的回填,所以我们将回填的代码放入useEffect

粒子动画

登录页面的Canvas动画,使用到的是一个第三方库,叫做 react-canvas-nest

react-canvas-nest - npm (npmjs.com)

配置初始化数据

数据流 (umijs.org)

getInitialState 方法可以配置一些初始化数据,编写 src/app.ts 的导出方法 getInitialState(),其返回值将成为全局初始状态。

可以在其他组件通过const initialState = useModel('@@initialState'); 获取。

以登录功能为例(类似于导航守卫):

export async function getInitialState() {if (location.pathname === '/login') {// 强行进入登录页const token = localStorage.getItem('token');if (token) {const res = await fetch('/api/user/info');if (res.data) {// 说明不仅有 token 而且 token 有效message.error('请先退出后再登录');history.go(-1);}}} else {// 进入其他页面const res = await fetch('/api/user/info');if (res.data) {// 说明不仅有 token 而且 token 有效const {name, avatar} = res.data;return {name, avatar};} else {// 说明没有 token 或者 token 无效 需要重新登录localStorage.removeItem('token');message.error('用户无效,请先登录');location.href = '/login';}}return {name: '@umijs/max'};
}

请求响应拦截器

请求 (umijs.org)

// 配置请求响应拦截器
export const request = {timeout: 3000,requestInterceptors: [function (url, options) {const token = localStorage.getItem('token');if (token) {options.headers['Authorization'] = `Bearer ${token}`;}return {url, options};}],responseInterceptors: [ // 直接写一个 function,作为拦截器(response) => {// 不再需要异步处理读取返回体内容,可直接在data中读出,部分字段可在 config 中找到const {data = {}, config} = response;// do somethingreturn response},// 一个二元组,第一个元素是 request 拦截器,第二个元素是错误处理[(response) => {return response}, (error) => {return Promise.reject(error)}],// 数组,省略错误处理[(response) => {return response}]]
}

退出登录、logo和标题的默认配置

布局与菜单 (umijs.org)

https://procomponents.ant.design/components/layout

export const layout = () => {return {logo: 'https://img.alicdn.com/tfs/TB1YHEpwUT1gK0jSZFhXXaAtVXa-28-27.svg',menu: {locale: false,},logout: () => {localStorage.removeItem('token');location.href = '/login';message.success('退出成功')}};
};

权限管理

权限 (umijs.org)

  1. 开启配置 umirc.js 中配置 access: {},

路由菜单权限

  1. src/access.ts 提供权限配置

该文件需要默认导出一个方法,导出的方法会在项目初始化时被执行。该方法需要返回一个对象,对象的每一个值就对应定义了一条权限。

export default (initialState) => {// 在这里按照初始化数据定义项目中的权限,统一管理// 参考文档 https://umijs.org/docs/max/access// initialState 是自动传入的 是在 getInitialState 中定义在全局初始化的数据if (initialState) {return {superAdmin: initialState.adminInfo.permission === 1,normalAdmin: initialState.adminInfo.permission === 1 ||initialState.adminInfo.permission === 2,};} else {return {superAdmin: false,normalAdmin: false,}}
};
  1. 配合路由管理权限

权限 (umijs.org)

这里我自定义了 access 作为区别普通权限和超级权限。

{name: ' 管理员信息',path: '/user/manager',icon: 'TeamOutlined',component: './Manager',access: 'superAdmin',
},
{name: ' 个人信息',path: '/user/personal',icon: 'UserOutlined',component: './Personal',access: 'normalAdmin',
},

自定义权限

对于页面中某一块区域的权限管理,可以使用 useAccess。

import { useAccess } from 'umi';const access = useAccess();

useAccess() 方法可以返回一个对象:
{ superAdmin: false, normalAdmin: false, },由此获取该页面(路由)的权限。

<Access> 组件拥有 accessible 和 fallback 两个属性,当 accessible 为 true 时会渲染子组件,当 accessible 为 false 会渲染 fallback 属性对应的 ReactNode

<Accessaccessible={access.superAdmin}fallback={<div>Can not read foo content.</div>}
>Foo content.
</Access>

图表

图表 (umijs.org)

所有图表 (ant.design)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大咖论道,智慧档案编研知识共享

关注我们 - 数字罗塞塔计划 - 本期直播全程“回放”&#xff0c;主题分享以视频形式&#xff0c;专家们的观点以文字形式&#xff0c;便于细读和收藏。 一、主题分享 详细视频请在 公众号 数字罗塞塔计划 中观看 二、大咖论道 以下内容整理来自直播间&#xff0c;上海市…

多模态MLLM都是怎么实现的(9)-时序LLM是怎么个事儿?

时序预测这东西大家一般不陌生,随便举几个例子 1- 金融,比如预测股票(股市有风险,入市需谨慎),纯用K线做,我个人不太推荐 2- 天气,比如预测云图,天气预报啥的 3- 交通,早晚高峰,堵车啥的,车啥时候加油,啥时候充电之类的 4- 医疗,看你病史和喝酒的剂量建模,看你会…

软件测试经理工作日常随记【6】-利用python连接禅道数据库并自动统计bug数据到钉钉群

测试管理_利用python连接禅道数据库并统计bug数据到钉钉 这篇不多赘述&#xff0c;直接上代码文件。 另文章基础参考博文&#xff1a;参考博文 加以我自己的需求优化而成。 统计的前提 以下代码统计的前提是禅道的提bug流程应规范化 bug未解决不删除bug未关闭不删除 db_…

前端项目使用docker编译发版和gitlab-cicd发版方式

项目目录 app/ ├── container/ │ ├── init.sh │ ├── nginx.conf.template ├── src/ ├── .gitlab-ci.yml └── deploy.sh └── Dockerfile └── Makefilecontainer目录是放nginx的配置文件&#xff0c;给nginx镜像使用 .gitlab-ci.yml和Makefile是c…

什么是死锁,如何解决?

一、问题解析 死锁是指两个或两个以上的进程&#xff08;或线程&#xff09;在执行过程中&#xff0c;由于竞争资源或者由于彼此通信而造成的一种阻塞的现象&#xff0c;若无外力作用&#xff0c;它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁&#xff0c;这些…

Vue热更新出现内存溢出

Vue热更新出现内存溢出 vue-cli2遇到此问题的解决办法&#xff1a;vue-cli3遇到此问题的解决办法&#xff1a;方法一&#xff08;已测试ok&#xff09;方法二&#xff08;未尝试&#xff09; 开发项目有一段时间了&#xff0c;随着项目越来越大&#xff0c;打包的时间也相应的变…

用大模型搭建一个自己的新闻小助手

背景 信息快速增长的时代&#xff0c;及时获取到有价值的资讯是一件很必要的事情。已经有各类新闻app和获取信息的渠道了&#xff0c;为什么还需要在构建一个小助手来获取新闻资讯呢&#xff1f;其实原因很简单各类新闻app服务的是具体一类人群&#xff0c;个人和人群还是有偏…

python练习题-反转一个只有三位数的整数

【问题描述】&#xff1a;反转一个只有三位数的整数 [示例]&#xff1a;123 321 完整代码如下&#xff1a; nint(input()) if n<100 or n>999: print("请输入三位数&#xff01;") else: gen%10 shin//10%10 bain//100 m100*ge10*shibai…

瓦罗兰特账号怎么注册 瓦罗兰特延迟高用什么加速器

《瓦罗兰特》&#xff08;Valorant&#xff09;是由拳头游戏&#xff08;Riot Games&#xff09;开发并发行的一款免费的多人在线第一人称射击游戏&#xff08;FPS&#xff09;&#xff0c;它结合了传统的硬核射击机制与英雄角色的能力系统&#xff0c;为玩家提供了独特的竞技体…

5.28 学习总结

一.CSS学习(一) 一、CSS简介 1、什么是CSS CSS&#xff1a;Cascading Style Sheet 层叠样式表是一组样式设置的规则&#xff0c;用于控制页面的外观样式 2、为什么使用CSS 实现内容与样式的分离&#xff0c;便于团队开发样式复用&#xff0c;便于网站的后期维护页面的精确…

B站广告推广引流哪里能做?

哔哩哔哩&#xff08;B站&#xff09;作为国内领先的年轻人文化社区与视频平台&#xff0c;其独特的二次元文化氛围和高度活跃的用户群体&#xff0c;成为了众多品牌寻求突破、触达年轻消费群体的理想阵地。在这样一个充满活力但又竞争激烈的平台上有效推广&#xff0c;吸引并留…

ARM架构与分类

ARM架构&#xff0c;曾称进阶精简指令集机器&#xff08;Advanced RISC Machine&#xff09;更早称作Acorn RISC Machine&#xff0c;是一个32位精简指令集&#xff08;RISC&#xff09;处理器架构。 主要是根据FPGA zynq-7000的芯片编写的知识思维导图总结&#xff0c;没有会…

Java学习四

Random 随机数 数组 静态初始化数组 数组在计算机中的基本原理 数组的访问 什么是遍历 数组的动态初始化 动态初始化数组元素默认值规则 Java内存分配介绍 数组在计算机中的执行原理 使用数组时常见的一个问题 案例求数组元素最大值 public class Test1 {public static void ma…

白酒:产地的水资源与酿酒工艺的关联性

云仓酒庄豪迈白酒的酿造过程中&#xff0c;水资源与酿酒工艺之间存在着密切的关联性。水是白酒酿造的重要原料之一&#xff0c;其质量和数量直接影响着酿酒工艺的实施和酒的品质。下面我们和云仓酒庄豪迈白酒来深入探讨一下&#xff0c;产地的水资源如何与酿酒工艺产生关联。 首…

YOLOv8+PyQt5动物检测系统完整资源集合(yolov8模型,从图像、视频和摄像头三种路径识别检测,包含登陆页面、注册页面和检测页面)

1.猫狗猴检测YOLOv8&#xff08;https://mbd.pub/o/bread/mbd-ZpaTl51u&#xff09;_哔哩哔哩_bilibili 资源包含可视化的动物检测系统&#xff0c;基于最新的YOLOv8训练的动物检测模型&#xff0c;和基于PyQt5制作的可视化动物检测系统&#xff0c;包含登陆页面、注册页面和检…

嵌入式UI开发-lvgl+wsl2+vscode系列:2、label(标签)+button(按钮)+slider(滑块)控件熟悉及其示例demo运行

文章目录 一、前言二、常见控件示例demo模拟环境运行及接口熟悉&#xff08;重要&#xff09;如何修改示例main函数测试各种示例1、label示例1.1、label示例1&#xff08;标签基础示例&#xff09;1.2、label示例2&#xff08;标签带阴影效果&#xff09;1.3、label示例3&#…

趣店集团golang一面要个20K,Channel什么情况下会出现死锁,有遇到过吗?

结束后面试官加了VX&#xff0c;并询问方便二面的时间&#xff0c;一直还没回复&#xff0c;拖着拖着给忘啦... 面试题 1、自我介绍 2、你在团队里头负责哪一块&#xff0c;这个物流开放平台流量多大 3、为什么今年3月份被从物流开放团队转到了finance财务部门&#xff0c;感…

什么是GPT-4o,推荐GPT-4o的获取使用方法,使用GPT4o模型的最新方法教程(2024年5月16更新)

2024年5月最新GPT-4o模型使用教程和简介 2024年5月最新GPT-4o模型使用教程和简介 2024 年 5 月 13 日&#xff0c;openai 发布了最新的模型 GPT4o。 很多同学还不知道如何访问GPT-4、GPT-4 Turbo和GPT-4o等模型&#xff0c;这篇文章介绍如何在ChatGPT中访问GPT-4o&#xff0…

华为WLAN实验继续-2,多个AP如何部署

----------------------------------------如果添加新的AP&#xff0c;如何实现多AP的服务----------- 新增加一个AP2启动之后发现无法获得IP地址 在AP2上查看其MAC地址&#xff0c;并与将其加入到AC中去 打开AC&#xff0c;将AP2的MAC加入到AC中 sys Enter system view, re…

springboot项目war包部署到腾讯云服务器

一、购买服务器 试用 1 个月&#xff08;需要实名和人脸验证&#xff09; 云产品免费体验馆_云产品免费试用_个人云产品试用-腾讯云 重置密码 登录以后 二、云服务器安装MySql 登录后&#xff0c;接下来的一切我们使用linux命令来操作。 1、卸载centos默认安装的mariadb rp…