【umi-max】初识 antd pro

news2024/11/18 8:31:00

修改端口号

根目录下的 .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}  // 配置表格的行 key
    pagation={{
        showQuickJumper: true,
        showSizeChanger: true,
        pageSizeOptions: ['10', '20', '30', '40'],
        ...pagation, // 这个参数是自定义的 state 用于响应式改变 current 和 pageSize
        onChange: 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 something
            return 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

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

图表

图表 (umijs.org)

所有图表 (ant.design)

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

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

相关文章

pands使用openpyxl引擎实现EXCEL条件格式

通过python的openpyxl库&#xff0c;实现公式条件格式。 实现内容&#xff1a;D列单元格不等于E列同行单元格时标红。 #重点是formula后面的公式不需要“”号。 from openpyxl.styles import Color, PatternFill, Font, Border from openpyxl.styles.differential import Dif…

记录深度学习GPU配置,下载CUDA与cuDnn

目标下载: cuda 11.0.1_451.22 win10.exe cudnn-11.0-windows-x64-v8.0.2.39.zip cuda历史版本网址 CUDA Toolkit Archive | NVIDIA Developer 自己下载过11.0.1版本 点击下载local版本,本地安装,有2个多GB,很大,我不喜欢network版本,容易掉线 cuDnn https://developer.nvi…

selenium源码学习

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

Zookeeper的watch 机制

Watch机制介绍 我们可以把Watch理解成是注册在特定Znode上的触发器。当这个Znode发生改变&#xff0c;也就是调用了create&#xff0c;delete&#xff0c;setData方法的时候&#xff0c;将会触发Znode上注册的对应事件&#xff0c;请求Watch的客户端会收到异步通知 ZooKeeper…

基于LLM的优化器评测-非凸函数

基于LLM的优化器评测-非凸函数 目标函数测试结果测试代码测试日志 背景: ​ 很多时候我们需要为系统寻找最优的超参.比如模型训练,推理的量化等.本文尝试将LLM当成优化器,帮忙我们寻找最优的超参. 验证方法: 1.设计一个已知最优解的多项式,该多项式有3个变量(因为3个变量可以…

深度解析Java 11核心新特性

码到三十五 &#xff1a; 个人主页 < 免责声明 > 避免对文章进行过度解读&#xff0c;因为每个人的知识结构和认知背景都不同&#xff0c;没有一种通用的解决方案。对于文章观点&#xff0c;不必急于评判。融入其中&#xff0c;审视自我&#xff0c;尝试从旁观者角度认清…

基于python flask +pyecharts实现的气象数据可视化分析大屏

背景 气象数据可视化分析大屏基于Python Flask和Pyecharts技术&#xff0c;旨在通过图表展示气象数据的分析结果&#xff0c;提供直观的数据展示和分析功能。在当今信息化时代&#xff0c;气象数据的准确性和实时性对各行业具有重要意义。通过搭建气象数据可视化分析大屏&…

【Linux】Linux基本指令1

1.软件&#xff0c;OS&#xff0c;驱动 我们看看计算机的结构层次 1.1.操作系统 操作系统是一款做 软硬件管理 的软件 操作系统&#xff08;计算机管理控制程序&#xff09;_百度百科 (baidu.com) 操作系统&#xff08;英语&#xff1a;Operating System&#xff0c;缩写&a…

60. UE5 RPG 使用场景查询系统(EQS,Environment Query System)实现远程敌人寻找攻击位置

UE的Environment Query System&#xff08;EQS&#xff09;是环境查询系统&#xff0c;它是UE4和UE5中用于AI决策制定过程中的数据采集和处理的一个强大工具。EQS可以收集场景中相关的数据&#xff0c;利用生成器&#xff08;Generator&#xff09;针对用户的测试&#xff08;T…

身份认证页面该怎么设计更加合理?

一、认证页面的作用 认证页面在应用程序中具有以下几个重要的作用&#xff1a; 验证用户身份&#xff1a;认证页面的主要作用是验证用户的身份。通过要求用户提供正确的凭据&#xff08;如用户名和密码、生物特征、验证码等&#xff09;&#xff0c;认证页面可以确认用户是合法…

安卓开机启动阶段

目录 概述一、boot_progress_start二、boot_progress_preload_start三、boot_progress_preload_end四、boot_progress_system_run五、boot_progress_pms_start六、boot_progress_pms_system_scan_start七、boot_progress_pms_data_scan_start八、boot_progress_pms_scan_end九、…

Docker(三) 容器管理

1 容器管理概述 Docker 的容器管理可以通过 Docker CLI 命令行工具来完成。Docker 提供了丰富的命令&#xff0c;用于管理容器的创建、启动、停止、删除、暂停、恢复等操作。 以下是一些常用的 Docker 容器命令&#xff1a; 1、docker run&#xff1a;用于创建并启动一个容器。…

ubuntu22.04安装调节显示器亮度工具

1 介绍 软件名叫 DDC/CI control&#xff0c;官网 2 安装方法 sudo apt install intltool i2c-tools libxml2-dev libpci-dev libgtk2.0-dev liblzma-dev3 效果 进入软件&#xff0c;忽略告警信息

selenium 学习笔记(一)

pip的安装 新建一个txt curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py 把上面的代码复制进去后&#xff0c;把后缀名改为.bat然后双击运行 当前目录会出现一个这个文件 然后在命令行pyhon get-pip.py等它下好就可以了selenium安装 需要安装到工程目…

【进程空间】通过页表寻址的过程

文章目录 前言介绍页表、页框、页目录的概念页框页表页目录页表和页目录的分配 一级页表和二级页表一级页表寻址过程 二级页表寻址过程 一级页表和二级页表的对比 前言 我们知道每个进程都有属于自己的虚拟地址空间&#xff0c;且每个进程的虚拟地址都是统一的。要想通过虚拟地…

OrangePi AIpro测评:智能与创新的完美结合

OrangePi AIpro上手指南 简介 香橙派与华为合作发布的香橙派AiPro为Ai主力&#xff0c;为边缘设备的Ai计算提供了可能。 集成图形处理器&#xff0c;拥有8GB/16GB LPDDR4X&#xff08;我这个是8G内存版本的&#xff09;&#xff0c;可以外接32GB/64GB/128GB/256GB eMMC模块&a…

【从零开始学习RabbitMQ | 第三篇】什么是延迟消息

目录 前言&#xff1a; 延迟消息&#xff1a; 延迟消息实现方式&#xff1a; 死信交换机&#xff1a; 延迟消息插件&#xff1a; 1.基于注解的方式 2.基于Bean的方式 总结&#xff1a; 前言&#xff1a; 在现代软件开发中&#xff0c;异步消息处理已成为构建可扩展、高可…

CR渲染噪点严重怎么办?常见噪点来源+排查方法

使用Corona渲染器进行渲染时&#xff0c;画面出现噪点是常见现象&#xff0c;尤其是在渲染初期。轻微的高频噪点通常是正常的&#xff0c;但如果经过多次渲染或长时间渲染后噪点依然明显&#xff0c;就可能意味着渲染设置或场景本身存在问题。虽然我们可以利用降噪功能模糊噪点…

5G专网驻网失败分析(suci无效)

suci 5G终端第一次驻网时&#xff0c;注册消息Registartion request中携带的5GS mobile identity要携带suci类型的mobile identity。 注册消息协议规范见5G NAS 协议3gpp TS24.501 8.2.6 Registration request。 suci协议规范参见3gpp TS24.501 9.11.3.4 5GS mobile identity …

iOS--工厂设计模式

iOS--工厂设计模式 设计模式的概念和意义类族模式UIButton作为类族模式的例子总结 三种工厂设计模式简单工厂模式&#xff08;Simple Factory Pattern&#xff09;&#xff1a;代码实例 工厂方法模式&#xff08;Factory Method Pattern&#xff09;&#xff1a;代码实例 抽象工…