1、表单rule中可以分对象处理不同规则

  1. <FormItem label="类型名称" {...formLayout}>
  2. { form.getFieldDecorator('name', {
  3. rules: [
  4. { required: true, message: '请输入2-5字中文、数字、或英文类型名称' },
  5. { pattern: /^[\u4E00-\u9FA5A-Za-z0-9]+$/, message: '请输入2-5字中文、数字、或英文类型名称'},
  6. { min: 2, max: 5, message: '请输入2-5字中文、数字、或英文类型名称' }
  7. ],
  8. initialValue: current && current.name ? current.name : ''
  9. })(<Input placeholder="请输入" />)}
  10. </FormItem>  

2、富文本中的引用、代码、链接没有用

  • 问题原因: 没有考虑到不加媒体文件时,对象中没有url,不用进行字符串替换
  • 解决:添加判断条件
    1. const defaultContent = (content) => {
    2. let contentObj = JSON.parse(BraftEditor.createEditorState(content).toRAW());
    3. let urlArr;
    4. Object.keys(contentObj.entityMap).forEach((key) => {
    5.  
    6. // 如果对象里有url,说明有媒体文件,处理标签
    7. if(contentObj.entityMap[key].data.url){
    8. urlArr = contentObj.entityMap[key].data.url.split('/')
    9. console.log('默认内容', urlArr);
    10. if(urlArr.length == 2){ //ios视频前缀yihezo
    11. urlArr.splice(0,1);
    12. contentObj.entityMap[key].data.url = `${setFileHost()}`+ 'yihezo/' + urlArr.join('/');
    13. }
    14.  
    15. if(urlArr.length == 3){ //其它媒体文件前缀sys/tutorail
    16. urlArr.splice(0,1);
    17. contentObj.entityMap[key].data.url = `${setFileHost()}`+ 'sys/' + urlArr.join('/');
    18. }
    19. }
    20. });
    21. let contentRaw = JSON.stringify(contentObj);
    22. return contentRaw;
    23. }  
  • 注释:【引用】显示是文字段落前后有缩进
  • 最终解决方法:删掉了代码与引用功能

3、Input表单填写价格数字后,过段时间看,价格会变为0.1

  • 出现0.1的原因:校验最小值与最大值时给了最小值和最大值的默认为0.1
  • 错误处:原来的校验最大值使用了
    1. max={getFieldValue('oldPrice') && Number(getFieldValue('oldPrice'))}
  • 解决方法:

    1. else if (value && getFieldValue('oldPrice') && (value < 0 || value > Number(getFieldValue('oldPrice'))) ){
    2. callback(`请输入0-${getFieldValue('oldPrice')}货款`)
    3. }

4、表单中的Switch只有勾选、勾选再取消才能提交,期望:未勾选时也能提交  

  1. initialValue: current && detail ? detail.fromSystem : false

5、Button按钮可根据数据状态决定当前是否禁用  

  1. disabled={detail && !params.cloneId ? true : false}

6、添加产品,产品图片第一张添加为视频时,产品缩略图没有显示出来

  

  • 添加了获取视频第一帧方法

    1. getVideoImg = (v, index) => {
    2. if(!this['video_div'+index]) {
    3. return
    4. }
    5. let me = this;
    6. let video = document.createElement("video");
    7. video.src= setFileHost() + v;
    8.  
    9. video.load();
    10.  
    11. video.onloadeddata = function () {
    12. if(!me['video_div'+index]) {
    13. return
    14. }
    15. let canvas = document.createElement("canvas");
    16.  
    17. canvas.width = 100;
    18. canvas.height = 80;
    19. canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);
    20.  
    21. me['video_div'+index].innerHTML = '';
    22. me['video_div'+index].appendChild(canvas);
    23. }
    24. }
  • 产品列表和订单列表获取index,利用setTimeout异步等待包含ref的div渲染完成后调用函数填入canvas

    1. if(item.rotationChart.length && item.rotationChart[0].type == 'video') {
    2. setTimeout(() => this.getVideoImg(item.rotationChart[0].img, index), 0 )
    3. }

7、搜索框未输入东西时,点击查询,报500;新增供货商或编辑供货商,提交后,报500

  • 原因1:keyword没有输入时,默认值需要传空串;
  • 原因2:新增和编辑之后调用的重新查询列表请求 与 返回时调用的重复;

8、单独的由getFieldDecorator注册的Input输入框表单只能一个字一个字的输入

  • 问题:input输入框输入一个字符失去焦点
  • 原因:input输入框在render方法中通过函数创建,监听了onChange事件,内容有变化就setState,

    数据变化,触发render函数更新执行,当input动态添加或删除时,

    React会重新创建DOM,新的input是没有焦点的

  • 解决:
    1. onBlur={(e) => this.handleJGChange(e, index)}
    2. onPressEnter={(e) => this.handleJGChange(e, index)}

9、上传商品详情时,选择一张图片后删除,再选择图片,点击确定,会出现之前删除的图片  

  1. // Upload组件的删除图片方法
  2. handleDetailImgRemove = (file) => {
  3. let detailFileList = this.state.detailFileList;
  4. let uid = file.uid;
  5. let index = detailFileList.indexOf(uid);
  6.  
  7. let detailImgFile = this.state.detailImgFile; if(index != -1){
  8. detailImgFile.splice(index, 1);
  9. }
  10. this.setState({
  11. detailFileList,
  12. detailImgFile
  13. }, () => {
  14. return true
  15. })
  16. }
  17.  
  18. // 限制可产品(图文)详情的detailFileList数组的图片数量
  19. setDetailImg = (res, file) => {
  20. let { detailImgFile = [] } = this.state;
  21. let { detailFileList = [] } = this.state;
  22. if(detailImgFile.length >= 5 ){
  23. message.error('批量上传一次最多上传5张')
  24. return ;
  25. }
  26.  
  27. detailImgFile.push(res);
  28. detailFileList.push(file.uid);
  29. this.setState({
  30. detailImgFile,
  31. detailFileList
  32. });
  33. }
  • 再生问题:一次性选择7张图片时,提示最多五张;从第一张开始删除,删除两张后点击提交,却只出现了三张图片  
  1. // beforeUpload图片文件上传之前判断
  2. if(fileList.indexOf(file) >= 5){
  3. message.error('批量上传一次最多上传5张');
  4. return false; // 阻止上传
  5. }

10、首页商品设置 页面变空白  

  • 原因:列表展示,是根据商品的sortNo位置序号作为List下标index渲染展示的,如果sortNo没有连续,List的渲染遇到空对象就会报错
  • 解决:后端更改sortNo数据为连续
  • 注释:这种开发思路是为了方便改变商品的sortNo排列顺序,实现上移下移,但这样对于渲染列表更新数据来说是有问题的,尽量不使用

11、可动态增删的关联Input输入框是一个表单项,也有字数限制

  • 参数类型和参数值以键值对对象的内容校验
  1. validator: (_, value, callback) => {
  2. if (!value.key || !value.value || (value.key && value.key.length > 10) || (value.value && value.value.length > 10)) {
  3. callback('请输入10字内参数及信息或删除此输入框')
  4. } else {
  5. callback()
  6. }
  7. }

12、富文本内容详情字限为50-15000000字,实际输入1个字,也能提交成功  

  • 富文本不计算文字长度,计算内容转换为HTML后的字符串长度
  1. value.toHTML().length < 50 || value.toHTML().length > 15000000

13、Upload上传轮播图媒体文件,上传图片时走裁剪过程,应可上传视频  

  • 问题:新增上传视频需求
  • 解决:增加上传文件类型-video/*,不经过裁剪过程,直接上传存储

14、价格通过rule的pattern正则限制只能填写整数

  1. <FormItem label="产品价格" {...formLayout}>
  2. { getFieldDecorator('price', {
  3. rules: [{
  4. type: 'number',
  5. required: true,
  6. message: '请输入1-100000元整数产品价格',
  7. min:1,
  8. max:100000,
  9. pattern: new RegExp(/^[1-9]\d*$/, "g"), // 正则验证整数
  10. }],
  11. initialValue: current && detail ? detail.price/100 : ''
  12. })(<InputNumber
  13. min={1}
  14. max={100000}
  15. style={{width: 120}}
  16. placeholder="请输入"
  17. />)}
  18. </FormItem>

15、商品的现价原价填写小数点后超过两位时,提交商品时应提示“现/原价不应超过小数点后两位”  

  1. { getFieldDecorator('oldPrice', {
  2. validateTrigger: ['onChange', 'onBlur'],
  3. rules: [
  4. {
  5. type: 'number',
  6. required: true,
  7. validator: (_, value, callback) => {
  8. if (!value) {
  9. callback('请先输入1-50000原价')
  10. } else if ( String(value).split('.')[1] && String(value).split('.')[1].length > 2){
  11. callback(`原价不应超过小数点后两位`)
  12. } else{
  13. callback()
  14. }
  15. }
  16. }
  17. ],

  


注:转载请注明出处

【后台管理系统】—— Ant Design Pro 项目爬坑(一)的更多相关文章

  1. 【零售App】—— react/ant design mobile项目爬坑

    一.H5制作 - 图片文本的动画效果 bug:打开一个模板,添加图片,添加动画效果,若先选定动画效果,再调节动画时间和延迟时间,则动画和延迟时间没有改变:若先调节动画时间和延迟时间在选定动画效果,则动 ...

  2. Ant Design Pro项目打开页设为登录或者其他页面

    Ant Design Pro项目打开页设为登录或者其他页面 一.打开页设为登录页 首先找到utils包中的authority文件,在该文件中找到如下代码: export function getAut ...

  3. 实战 ant design pro 中的坑

    1.替换mock数据: 1.将:.roadhogrc.mock.js 中的代理模式替换 当不使用代理的时候就会将所有 /api/的链接换成 http://localhost:8080/ export ...

  4. 【后台管理系统】—— Ant Design Pro入门学习&项目实践笔记(三)

    前言:前一篇记录了[后台管理系统]目前进展开发中遇到的一些应用点,这一篇会梳理一些自己学习Ant Design Pro源码的功能点.附:Ant Design Pro 在线预览地址. Dashboard ...

  5. ant design pro(一)安装、目录结构、项目加载启动【原始、以及idea开发】

    一.概述 1.1.脚手架概念 编程领域中的“脚手架(Scaffolding)”指的是能够快速搭建项目“骨架”的一类工具.例如大多数的React项目都有src,public,webpack配置文件等等, ...

  6. 使用ant design pro搭建项目

    脚手架搭建 git clone --depth=1 https://github.com/ant-design/ant-design-pro.git my-project 然后 cd my-proje ...

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

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

  8. 阿里开源项目之Ant Design Pro

    本篇文章主要包含的内容有三个方面. 第一.Ant Design Pro简介; 第二.Ant Design Pro能做什么; 第三.初步使用; 我相信通过这三个方面的讲解能让你大概知道Ant Desig ...

  9. Ant Design Pro 学习笔记:数据流向

    在讲这个问题之前,有一个问题应当讲一下: Ant Design Pro / umi / dva 是什么关系? 首先是 umi / dva 的关系. umi 是一个基于路由的 react 开发框架. d ...

随机推荐

  1. linux复习3:linux字符界面的操作

    一.前言 1.对linux服务器进行管理的时候,经常要进入字符界面进行操作,使用命令需要记住该命令的相关选项和参数.vi编辑器可以用于编辑任何ASCII文本,功能非常的强大,可以对文本进行创建.查找. ...

  2. JavaScript concat() 方法

    昨天接触了一个项目,我的tbody变量是一个数组,然后数据返回的是数组里面包含对象,我刚开始没看懂这个concat的作用,然后百度一下javascript中的用法,以此记录concat的方法: dat ...

  3. 日语能力考试N2级核心词汇必备—形容词

    日语能力考试N2级核心词汇必备—形容词 ありがたい·有難い 难得的,值得感谢的,真高兴的あかい·赤い 红色的,左翼的,共产主义的あさい·浅い 浅的,事物的程度等小的,色淡的,浅薄的,肤浅的あつい· 1 ...

  4. 破解phpStorm 2018 亲测

    网上教程很多,这里我就不多赘述,我也是看其他教程试过来的. 下面分步骤介绍一下: 1.下载,我这里选用的版本是 phpStorm 2018.3 ,下载地址 https://www.newasp.net ...

  5. PHP5 构造函数

    在最近自己写的PHP小程序中遇到了如何使用PHP构造函数的情况,在PHP中允许我们在一个类中定义一个构造函数 如: <?php class User { public $name; functi ...

  6. python编码环境安装与基本语法

    一.pycharm的基本使用 1.python以及pycharm的安装 python的版本选择:3.x版本就行 pycharm的版本选择:社区版就够用 pycharm只是一个编写工具,python才是 ...

  7. Linux学习--第十二天--服务、ps、top、pstree、kill、&、jobs、fg、vmstat、dmesg、free、uptime、uname、crontab、ls

    服务分类 linux服务分为rpm包默认安装的服务和源码包安装的服务. rpm包默认安装的服务分为独立的服务和基于xinetd服务. 查询已安装的服务 rpm包安装的服务 chkconfig --li ...

  8. VMware® Workstation 设置虚拟机目录和共享目录不要相同!

    在设置VMware的首选项是,工作区中的虚拟机的默认地址和共享虚拟机的位置目录不要设置成一样的. 否则创建的虚拟机打不开.

  9. Solaris 11中配置基于link的IPMP

    http://blog.itpub.net/29960937/viewspace-1347901/ Tips: Record and feedback errors you have encounte ...

  10. 【洛谷P3723】礼物

    题目大意:给定两个序列 A.B,现可以将 A 序列的每一个元素的值增加或减少 C,求 \(\sum\limits_{i=0}^{n-1}(a_i-b_{i+k})^2\) 的最小值是多少. 题解:先不 ...