【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}  // 配置表格的行 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.mfbz.cn/a/653663.html

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

相关文章

Yourpassword does not satisfy the current policyrequirements

mysql 新增数据库用户失败 解决方法&#xff1a; 修改校验密码策略等级 set global validate_password.policyLOW;

【K8s】专题四(1):Kubernetes 控制器简介

以下内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01;如果对您有帮助&#xff0c;烦请点赞、关注、转发&#xff01;欢迎扫码关注个人公众号&#xff01; 目录 一、基本概念 二、工作原理 三、常见类型 四、相关特性 一、基本概念 Kubernetes 控制器…

js中金额进行千分以及toFixed()保留两位小数丢失精度的问题

1、金额进行千分 function commafy(num) { if ((num "").trim() "") { return ""; } if (isNaN(num)) { return ""; } num num ""; if (/^.*\..*$/.test(num)) { const pointIndex num.lastIndexOf("."); co…

像素匹配+均值homograph+结果

1. 像素匹配 2. 均值homography 转换前转换后 3. 比较 基准图转换图

Kibana创建ElasticSearch 用户角色

文章目录 1, ES 权限参考2, 某应用的管理员权限&#xff1a;可以open/close/delete/cat/read/write 索引3, 某应用的读写权限&#xff1a;可以cat/read/write 索引 &#xff08;不能删除索引或数据&#xff09;4, 某应用的只读权限 1, ES 权限参考 https://www.elastic.co/gui…

Linux——Docker容器虚拟化平台

安装docker 安装 Docker | Docker 从入门到实践https://vuepress.mirror.docker-practice.com/install/ 不需要设置防火墙 docker命令说明 docker images #查看所有本地主机的镜像 docker search 镜像名 #搜索镜像 docker pull 镜像名 [标签] #下载镜像&…

智能奶柜:重塑牛奶零售新篇章

智能奶柜&#xff1a;重塑牛奶零售新篇章 回忆往昔&#xff0c;孩童时代对送奶员每日拜访的期待&#xff0c;那熟悉的一幕——新鲜牛奶被细心放置于家门口的奶箱中&#xff0c;成为了许多人温馨的童年记忆。如今&#xff0c;尽管直接投递袋装牛奶的情景已不多见&#xff0c;但…

机器学习-6-对随机梯度下降算法SGD的理解

参考一文带您了解随机梯度下降(Stochastic Gradient Descent):python代码示例 参考sklearn-SGDClassifier 1 梯度下降 在机器学习领域,梯度下降扮演着至关重要的角色。梯度下降是一种优化算法,通过迭代沿着由梯度定义的最陡下降方向,以最小化函数。类似于图中的场景,可以…

【自动驾驶技术栈学习】2-软件《大话自动驾驶》| 综述要点总结 by.Akaxi

----------------------------------------------------------------------------------------------------------------- 致谢&#xff1a;感谢十一号线人老师的《大话自动驾驶》书籍&#xff0c;收获颇丰 链接&#xff1a;大话自动驾驶 (豆瓣) (douban.com) -------------…

新版idea配置git步骤及项目导入

目录 git安装 下载 打开git Bash 配置全局用户名及邮箱 查看已经配置的用户名和邮箱 在IDEA中设置Git 问题解决 项目导入 git安装 下载 进入官网 Git - Downloads 点击所属本机系统&#xff0c;window如下图 选择64位安装 按照默认步骤一直下一步即可 打开git Bash …

2024下半年BRC-20铭文发展趋势预测分析

自区块链技术诞生以来&#xff0c;其应用场景不断扩展&#xff0c;代币标准也在不断演进。BRC-20铭文作为基于比特币区块链的代币标准&#xff0c;自其推出以来&#xff0c;因其安全性和去中心化特性&#xff0c;受到了广泛关注和使用。随着区块链技术和市场环境的不断变化&…

二零二四充能必读 | 618火热来袭,编程书单助你提升代码力

文章目录 &#x1f4d8; Java领域的经典之作&#x1f40d; Python学习者的宝典&#x1f310; 前端开发者的权威指南&#x1f512; 并发编程的艺术&#x1f916; JVM的深入理解&#x1f3d7; 构建自己的编程语言&#x1f9e0; 编程智慧的结晶&#x1f31f; 代码效率的提升 亲爱的…

【学习Day1】中央处理单元CPU

✍&#x1f3fb;记录学习过程中的输出&#xff0c;坚持每天学习一点点~ ❤️希望能给大家提供帮助~欢迎点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;指点&#x1f64f; 中央处理单元CPU 中央处理器&#xff08;CPU&#xff0c;central processing unit&#xff…

Fastjson 反序列化漏洞[1.2.24-rce]

漏洞复现环境搭建请参考 http://t.csdnimg.cn/vSaaw kali切换jdk版本请参考 Kali安装JAVA8和切换JDK版本的详细过程_kali安装jdk8-CSDN博客 漏洞原理 Fastjson提供的com.sun.rowset.JdbcRowSetImpl类下的dataSourceName方法支持传入一个RMI/LDAP源&#xff0c;支持远程调用。…

弘君资本炒股技巧:股票定向增发是什么意思?是好是坏?

股票定向增发是指已上市的公司向指定的组织或者个人投资者额外发行股份募集资金的融资方法&#xff0c;发行价格为发行前某一阶段的平均价的必定比例&#xff0c;增发的价格不得低于前二十个买卖日股票均价的80&#xff05;。 例如&#xff0c;个股定增前二十个买卖股票平均价为…

Unity Apple Vision Pro 开发(一):开发前期准备【软硬件要求 | 开发者模式 | 无线调试打包】

文章目录 &#x1f4d5;教程说明&#x1f4d5;硬件要求&#x1f4d5;软件要求⭐Xcode 15.2 及以上⭐visionOS 1.0 (21N301) SDK 或者更高版本⭐Unity 2022 LTS for Apple Silicon (2022.3.18f1及以上的版本)⭐Unity Pro/Unity Enterprise/Unity Industry的授权许可证 &#x1f…

【STL】C++ list 基本使用

目录 一 list 常见构造 1 空容器构造函数&#xff08;默认构造函数&#xff09; 2 Fill 构造函数 3 Range 构造函数 4 拷贝构造函数 二 list迭代器 1 begin && end 2 rbegin && rend 三 list 容量操作 四 list 修改操作 1 assign 2 push_front &a…

R25 型双极型晶体管 433功率放大器,集电极电流可达100mA

R25 型硅基微波双极型晶体管是一种常见的晶体管&#xff0c;主要用于高频电子放大线路中。常被用作放大器、开关、变频器等电子电路中的核心元件。在放大电路中&#xff0c;它可以将微弱的信号放大到足以驱动输出负载&#xff1b;在开关电路中&#xff0c;它可以实现电路的打开…

【数据分析面试】55. 寻找双词组 (Python)

题目&#xff1a; 寻找双词组 &#xff08;Python&#xff09; 编写一个名为 find_bigrams 的函数&#xff0c;该函数接收一个句子或段落的字符串&#xff0c;并按顺序返回其所有双词组的列表。 注意&#xff1a; 双词组是指连续的两个单词。 示例&#xff1a; 输入&#x…

11款必备IP地址管理软件,你都用过吗?

1、LightMesh IPAM 产品描述&#xff1a;LightMesh IPAM 是一款功能强大的工具&#xff0c;可简化和自动化互联网协议网络的管理。它提供可扩展性、子网规划器、即时云发现、IP 和网络管理以及 IP 规划和可视化&#xff0c;以帮助您优化效率、可见性和安全性。 特征&#xff1…