antd design pro+hooks+typescript项目实战指南

开始之前,你可以先体验一下这个项目:在线预览

源码附在文章末尾, 注意查收。

技术栈简介

  • react@16.8.6 :用于构建用户界面的 MVVM 框架
  • umi@2.8.7: 可插拔的企业级 react 应用框架
  • dva@2.4.1: 基于 redux 和 redux-saga 的数据流方案
  • antd@3.21.4:基于 Ant Design 设计体系的 React UI 组件库
  • Ant Design Pro@v4:一个企业级中后台前端/设计解决方案
  • Axios@0.19.0:一个基于 promise 的 HTTP 库
  • UForm@0.3.10:中后台领域的表单解决方案
  • typescript@3.5.3:Javascript的超集

主要目录结构

├── config                       # umi 配置,包含路由,构建等配置
├── src                                                  # 开发主目录
│   ├── assets                   # 本地静态资源
│   ├── components               # 业务通用组件
│   │   ├── Authorized           # 权限认证
│   │   ├── Exception            # 异常组件
│   │   ├── GlobalHeader         # 全局头部
│   │   ├── HeaderDropdown       # 头部下拉选项
│   │   ├── PageLoading          # 页面加载
│   │   ├── SelectLang           # 语言选择
│   │   └── StandardTable        # 高级表格
│   ├── global.less              # 全局样式
│   ├── global.tsx               # 全局js
│   ├── layouts                  # 页面通用布局组件
│   ├── locales                  # 国际化语言包
│   ├── models                   # 全局model
│   │   ├── account.ts           # 用户相关model
│   │   ├── connect.d.ts         # model相关类型定义
│   ├── pages                    # 页面
│   │   ├── Authorized.tsx       # 权限过滤
│   │   ├── Exception            # 错误页面:404 403 500
│   │   ├── Home                 # 首页
│   │   ├── Product              # 产品列表、产品分类
│   │   ├── Account              # 登录页面
│   │   └── User                 # 用户列表
│   ├── services                 # api接口
│   └── utils                    # 通用方法

项目简介

做为一个基于antd-design-proreact hooks打造的后台管理系统项目,该项目利用了antd-design-pro提供的权限认证、配置化路由、页面布局组件、面包屑等功能,完成了登录、首页、产品、用户各模块的开发。此外,由于个人感觉antd提供的表单使用起来让我感觉不是很舒服,由此找到了UForm,使用UForm更高效的开发了产品编辑模块。

踩过的坑

  1. antd-design-pro v4这个版本,官方更加推荐使用区块的方案来添加页面,但是按照区块的时候,我发现等了好久都没有反应,网上冲浪发现有这个问题的人还不少。我最后的解决方案是:直接把pro-block整个仓库下载到本地,然后umi block add path/to/本地地址 --path=/页面目标地址,例:umi block add /Users/void/Documents/www/learn/pro-blocks/ListBasicList --path=/user/list

  2. 还是跟区块有关。当我添加一个区块的时候,可以看到添加进来的区块的目录结构是这样的


    block

    从图中可以看到它把utils、services、models、less一股脑儿的添加进去了,有些区块甚至还有自己的components,一开始我觉得就这样也没事,但是添加了几个区块之后,我发现,有些东西这个区块有,那个区块也有,所以我觉得区块好用,但是添加进来后,整理一下目录结构还有很有必要的。

  3. 上面我说过,该项目的表单使用了UForm进行开发,在处理事件上,他跟antd的form还是有很大的区别的,UForm中的事件需要在他提供的effects中去处理的,直接在Filed上写例如onChange是没有用的,正确使用方式如下

// SchemaForm中监听
<SchemaForm
  effects={($)=>{
    $("onFieldChange").subscribe((fieldState)=>{})
    $("onFormInit").subscribe((formState)=>{})
    $("onFormMount").subscribe((formState)=>{})
    $("onFormReset").subscribe((formState)=>{})
    $("onFormSubmit").subscribe((formState)=>{})
  )}
/>
// Field中监听
<Field
  title="一级分类"
  enum={categoryParentList}
  type="string"
  name="parentCategoryId"
  required
  x-effect={() => {
    return {
      onChange(categoryId: number) {
        getCategoryList(categoryId)
      }
    }
  }}
/>
  1. 在产品详情中,由于产品信息的分类是两级的,二级分类是根据一级分类的ID去异步获取到的子类目。一开始我使用antd的Cascader进行开发,在添加产品的时候,倒也没有问题,然而,在查看产品详情的时候,却发现Cascader无法满足根据一级分类获取二级分类并添加到指定一级分类children属性中,后面又改用了Select这个组件来重新开发。具体代码如下
<FormLayout inline={true}>
  <Field
    title="一级分类"
    enum={categoryParentList}
    type="string"
    name="parentCategoryId"
    required
    x-effect={() => {
      return {
        onChange(categoryId: number) {
          getCategoryList(categoryId)
        }
      }
    }}
   />
   {
    categoryList.length ? (
      <Field
        title="二级分类"
        enum={categoryList}
        type="string"
        name="categoryId"
        required
      />
    ) : null
 }
</FormLayout>
  1. 在使用typescript写项目的时候,会经常遇到ts的类型报错,如下图:
    ts报错

    这个时候,我们可以追踪到报错的根源,例如这里的interface.d.ts(53, 5),mac用户option+单击就可以,得到类型定义的正确路径并按如下所示引入到文件中就可以解决问题:
import { UploadFile } from 'antd/lib/upload/interface'
const [uploadList, setUploadList] = useState<UploadFile[]>([])

最后

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容