【前言】

找了很多Admin模板,最后还是看中了AntDesignPro(下文简写antd pro)这个阿里巴巴开源的Admin框架,长这样(还行吧,目前挺主流的):

官网地址:https://pro.ant.design/index-cn

该套模板是使用了React开发框架作为基础,AntDesign(蚂蚁金服开源UI组件库)作为UI库,集成了Dva,Umi,Mock等库,如果不是很了解这些内容,门槛还是比较高的。

我们今天需要实现一个需求:将Antd Pro模板中固定写死的菜单换成从服务器请求菜单然后进行渲染

为啥非要自己写,官网文档不香吗?----官方文档写的实在太草了,而且目前没有typescript方式的文档,需要踩多少坑...不过没关系,看完这篇坑就都基本填平了

【了解项目中的dva和Umi用法】

antd pro 默认采用了Umi和dva组件,因此想要在基础上添加功能必须了解数据请求和数据流向

在dva中主要分3层,models,services,components,其中models是最重要概念,这里放的是各种数据,与数据交互的应该都是在这里。services是请求后台接口的方法。components是我们编写的组件。

service层

service 层仅仅是封装了用request请求服务端的api的逻辑,这里不涉及业务逻辑,比较简单,例如下面代码:

import request from '@/utils/request';

export interface LoginParamsType {
userName: string;
password: string;
mobile: string;
captcha: string;
} export function fakeAccountLogin(params: LoginParamsType) {
return request('/api/login/account', {
method: 'POST',
data: params,
});
} export async function getFakeCaptcha(mobile: string) {
return request(`/api/login/captcha?mobile=${mobile}`);
}

models层

models层是核心业务逻辑的所在

import { Effect, Reducer } from 'umi';

import { queryCurrent, query as queryUsers } from '@/services/user';

export interface CurrentUser {
avatar?: string;
name?: string;
title?: string;
group?: string;
signature?: string;
tags?: {
key: string;
label: string;
}[];
userid?: string;
unreadCount?: number;
} export interface UserModelState {
currentUser?: CurrentUser;
} //定义接口
export interface UserModelType {
namespace: 'user';
state: UserModelState;
effects: {
fetch: Effect;
};
reducers: {
saveCurrentUser: Reducer<UserModelState>;
};
} const UserModel: UserModelType = {
//命名空间,component层调用路由方法的时候需要根据命名空间匹配
namespace: 'user', //存放值的地方
state: {
currentUser: {},
}, // 与后台交互,处理数据逻辑的地方
effects: {
//业务方法,这里的_是不需要参数,如果需要参数,这里改成传递进来的参数对象即可
//这里支持call,put,select等几种方法,用call调用service层的方法
//const m = yield select((state) => state.test.num) //select就是用来选择上面state里的,这里没用上
*fetch(_, { call, put }) {
//queryUsers是引入service层那个function的一个名字
const response = yield call(queryUsers);
yield put({
// 这就是reducer中save方法, put就是用来触发reducer的方法,payload里就是传过去的参数。 同时它也能触发同等级effects中其他方法。
type: 'saveCurrentUser',
payload: response,
});
},
}, // 能改变界面的action应该放这里,这里按官方意思不应该做数据处理,只是用来return state 从而改变界面
reducers: {
//可以理解为一个方法
saveCurrentUser(state, action) {
//return新的state,这样页面就会更新 es6语法,就是把state全部展开,然后把currentUser重新赋值
return {
...state,
currentUser: action.payload || {},
};
},
},
}; export default UserModel;

component组件中调用model层

在某一个方法里用dispatch即可调用

clickHandler = () => {
dispatch({
type: "user/fetch",// 这里就会触发models层里面effects中fetch方法(也可以直接触发reducer中方法,看具体情况) ,test就是user里的命名空间名字
payload: { },
})
}

这里注意一下type请求的方法路由即可,前面是命名空间,后面是方法名

使用connect获取dispatch调用后改变的state中的数据

首先需要在组件接口中定义字段,类型为model中定义的类型,因为要获取model中字段这个值,肯定是同一种类型的

然后在组件的实现中定义变量,从props中获取值

在组件代码下方的connect方法中将变量赋值,只有这里赋值了,组件中的常量才可以从props中获取到state中的值

这里connect方法的参数其实就是各个model中的state,dispatch后,这里便可以获取到修改后的值

tips:因为使用的是typescript,所以这里的参数需要在ConnectState中先定义:

【开始改造Antd Pro,实现从服务器请求菜单】

定义service

在src/services文件夹下新增文件 menu.ts

import request from '@/utils/request';

export async function query(): Promise<any> {
return request('/api/getmenu'); //这里是服务端的获取菜单的地址,根据自己情况进行调整
}

定义model

在src/models文件夹下新增文件 menu.ts

import { Effect, Reducer } from 'umi';
import { MenuDataItem } from '@ant-design/pro-layout';
import { query } from '@/services/menu'; export interface MenuModelState {
menuData: MenuDataItem[];
} export interface MenuModelType {
namespace: 'menu';
state: MenuModelState;
effects: {
getMenuData: Effect;
};
reducers: {
saveMenuData: Reducer<MenuModelState>;
};
} //这里做了个转换,可能服务端返回的接口格式和前端的路由格式并不一致,可以在这个方法里进行调整,这里的方法仅作参考,根据自己实际情况进行调整即可
const menuFormatter = (response: any) => {
if (response === null)
return []; var re = response.map((item: { name: string; route: string; children: any; }) => {
const result = {
children: {},
name: item.name,
path: item.route === null ? '/' : item.route,
}; if (item.children) {
result.children = menuFormatter(item.children);
} return result;
}) return re;
} const MenuModel: MenuModelType = {
namespace: 'menu',
state: {
menuData: [],
}, effects: {
*getMenuData(_, { put, call }) {
const response = yield call(query);
yield put({
type: 'saveMenuData',
payload: menuFormatter(response.data.viewMenu),
});
},
}, reducers: {
saveMenuData(state, action) {
return {
...state,
menuData: action.payload || [],
};
},
},
};
export default MenuModel;

调整组件 BasicLayout.tsx

antd pro的菜单调整在 src/layouts/BasicLayout.tsx 文件中

这里menuDataRender 默认指向一个方法,我这里不要原来的方式,我们要调整成自己的数据

以下代码如无特殊说明,都在 BasicLayout.tsx 文件中

1. 调整接口

在 BasicLayoutProps 接口中添加承载菜单的字段

2. 调整组件传入的字段,useEfect方法中加入请求服务的路由

3. 调整组件menuDataRender为使用传进来的菜单数据(以前那个方法不用了)

4. 调整connect方法,获取数据

menu是我们在models/menu.tx中定义的MenuModelState类型,光这里写会提示错误,我们需要在ConnectState中先将该字段定义才可以正常使用

【运行一下试试效果】

执行命令运行一下看看效果

cnpm start

可以看到,已经自动触发了后端接口,并获取到了数据,最后又用服务端的数据渲染了菜单

其他内容可以参考官方文档

antd pro官网地址:https://pro.ant.design/index-cn

Ant Design Pro V5 从服务器请求菜单(typescript版)的更多相关文章

  1. Ant Design Pro V5 与 IdentityServer 实现 Password 模式的登录

    最近处于休息状态,想趁着休息时间,为自己做一个后台. 后端框架选用了 Abp.之前公司使用了一些自研的框架,但由于人力资源有限,后期框架的升级及维护都是比较耗时,这次干脆直接使用Abp,即省心又能快速 ...

  2. (二)React Ant Design Pro + .Net5 WebApi:前端环境搭建

    首先,你需要先装一个Nodejs,这是基础哦.如果没有这方面知识的小伙伴可以在园子里搜索cnpm yarn等关键字,内容繁多,此不赘述,参考链接 一. 简介 1. Ant Design Pro v5 ...

  3. Ant Design Pro入门教程,安装,运行(V5 Typescript版)

    [前言] 找了很多Admin模板,最后还是看中了AntDesignPro这个阿里巴巴开源的Admin框架,长这样(还行吧,目前挺主流的): 官网地址:https://pro.ant.design/in ...

  4. 轻松玩转Ant Design Pro一

    ant design pro来源于ant design,其是一段自带样式的react组件,用于企业后台的漂亮的,可控的组件.ant design有很多组件和样式,不可能所有都记住,我们只要记住常用的, ...

  5. Ant Design Pro (中后台系统)教程

    一.概念:https://pro.ant.design/docs/getting-started-cn(官方网站) 1.Ant Design Pro 是什么:  https://www.cnblogs ...

  6. Ant Design Pro+Electron+electron-builder实现React应用脱离浏览器,桌面安装运行

    ant-design-pro ----> version :2.3.1 由于网上Ant Design Pro+Electron的资料太少,我就贡献一点经验   最近需要讲AntD Pro项目(以 ...

  7. ant design pro (十一)advanced Mock 和联调

    一.概述 原文地址:https://pro.ant.design/docs/mock-api-cn Mock 数据是前端开发过程中必不可少的一环,是分离前后端开发的关键链路.通过预先跟服务器端约定好的 ...

  8. ant design pro (八)构建和发布

    一.概述 原文地址:https://pro.ant.design/docs/deploy-cn 二.详细 2.1.构建 当项目开发完毕,只需要运行一行命令就可以打包你的应用: npm run buil ...

  9. Ant Design Pro快速入门

    在上一篇文章中,我们介绍了如何构建一个Ant Design Pro的环境. 同时讲解了如何启动服务并查看前端页面功能. 在本文中,我们将简单讲解如何在Ant Design Pro框架下实现自己的业务功 ...

随机推荐

  1. 01-flask虚拟环境

    一.虚拟环境 每一个环境都相当于一个新的操作系统.你可以在这个新的环境里安装软件,保存资料.每一个虚拟环境可以安装不同版本的软件,在不同虚拟环境中运行不同版本的软件互不影响.   二.virtuale ...

  2. matlab中的静态变量与全局变量

    matlab中的静态变量和全局变量 1.静态变量 在matlab中,和其他语言一样,函数中的变量一把都是局部变量,也就是说,在函数调用完毕后,变量就会被释放.但是有些时候回希望上次改变的变量在下一次调 ...

  3. vue :关于引用jquery的二三问题

    webpack版本:3.6.0 首先是引用jquery. 有两个地方要改. 1 (项目地址)/build/webpack.base.conf.js 2 (项目地址)/src/main.js webpa ...

  4. 【思维+大数(高精度)】number 计蒜客 - 45276

    题目: 求 1 到 10^n 的数字中有 3 的数字的数量. 输入格式 1 个整数 n. 输出格式 共一行,1 个整数,表示答案. 数据范围 对于 10% 的数据,n≤8 对于 30% 的数据,n≤1 ...

  5. Linux cut 命令详解

    cut 命令在Linux和Unix中的作用是从文件中的每一行中截取出一些部分,并输出到标准输出中.我们可以使用 cut 命令从一行字符串中于以字节,字符,字段(分隔符)等单位截取一部分内容出来. 在本 ...

  6. 015.Nginx重定向

    一 重定向概述 1.1 重定向介绍 重定向(Redirect)指通过各种方法将各种网络请求重新定个方向转到其它位置(如:网页重定向.域名的重定向.路由选择的变化也是对数据报文经由路径的一种重定向). ...

  7. SpringBoot 整合Mybatis + PageHelper 实现分页

    前言: 现在公司大多数都实现了前后端分离,前端使用Vue.React.AngularJS 等框架,不用完全依赖后端.但是如果对于比较小型的项目,没必要前后端分离,而SpringBoot也基本抛弃了Js ...

  8. asp.net core 3 使用nlog日志组件,使用$ {basedir}保存位置不对,记录下怎么解决

    $ {basedir}指向的是  AppDomain.CurrentDomain.BaseDirectory, Asp.Net.Core的解决方法可能如下(在Program.cs中添加两行): var ...

  9. 如何查看预收录在arXiv上论文的LaTeX源文件并编译

    arXiv 是一个收集物理学.数学.计算机科学与生物学论文预印本的网站. 对于理科生来说,经常需要在上面搜索下载一些论文,正常情况下,一般人下载的只是 pdf 文件,其实可以在 arXiv 上下载编译 ...

  10. spring学习(四)使用注解代替xml配置

    用的是IDEA的maven工程,pom.xml文件导包依赖省略 一.书写要导入容器的实体类 import org.springframework.beans.factory.annotation.Va ...