需求如图:

与后端协商好的表单数据为:

组件代码:

/* 阶梯分成组件 */
import React, { useState, useEffect } from 'react';
import { message, InputNumber, Button } from 'antd';
import { PlusOutlined, DeleteOutlined } from '@ant-design/icons';
import styles from './Condition.less'; let rowKey = 0; type ConfigProps = {
unit?: string;
afterText?: string;
precision?: number;
key?: string;
}; const Condition: React.FC<any> = (props) => {
const { value, maxLength, config, onChange } = props;
const [dataList, setDataList] = useState<any[]>([{ rowKey }]); // 新增
const handleAdd = () => {
if (dataList && dataList.length <= maxLength) {
if (!rowKey) rowKey = dataList.length || 0;
rowKey += 1;
const keyObj = {};
config.map((item: ConfigProps) => {
if (item.key) keyObj[item.key] = undefined;
});
const newObj = { ...keyObj, rowKey };
setDataList([...dataList, newObj]);
if (onChange) {
onChange([...dataList, newObj]);
}
} else {
message.error('已达添加上限');
}
}; // 删除
const handleDelete = (_key: any) => {
setDataList(dataList.filter((it: any) => it.rowKey !== _key));
if (onChange) {
onChange(dataList.filter((it: any) => it.rowKey !== _key));
}
}; // 要求整数
// const limitDecimals = (values?: string | number | undefined) => {
// if (values) return String(values).replace(/^(0+)|[^\d]+/g, '');
// return '';
// }; // 改变值
const handleNumber = (_value: number | string | null, data: any, key: string) => {
const newList = dataList.map((it) => {
if (it.rowKey === data.rowKey) {
return { ...it, [key]: _value };
}
return it;
});
setDataList(newList);
if (onChange) {
onChange(newList);
}
}; // 监听默认值更新
useEffect(() => {
if (value && value.length > 0) {
setDataList(value);
}
}, []); return (
<div
className={styles['m-condition']}
style={{
maxHeight: dataList.length > 10 ? '432px' : 'auto',
overflowY: dataList.length > 10 ? 'scroll' : 'auto',
}}
>
{dataList &&
dataList.map((item: any, index: number) => (
<div key={`${item.rowKey}${item.tips}`} style={{ marginBottom: '8px' }}>
<div
style={{
width: '100%',
display: 'flex',
justifyContent: 'flex-start',
alignItems: 'center',
}}
>
{config?.map((itemConfig: any, indexConfig: number) => {
return (
<span
key={itemConfig.afterText}
style={{ display: 'inline-flex', alignItems: 'center' }}
>
<InputNumber
max={
indexConfig === 0 ? item[config[1].key] || itemConfig.max : itemConfig.max
}
min={
indexConfig === 1 ? item[config[0].key] || itemConfig.min : itemConfig.min
}
style={{
width: '140px',
marginLeft: indexConfig === 0 ? 0 : '8px',
marginRight: '8px',
}}
precision={itemConfig.precision}
placeholder={'请输入'}
value={itemConfig.num}
onChange={(values) => handleNumber(values, item, itemConfig.key)}
key="NumberMin"
addonAfter={itemConfig.unit}
/>
<span>{itemConfig.afterText}</span>
</span>
);
})}
<DeleteOutlined
onClick={() => handleDelete(item.rowKey)}
style={{ marginLeft: '8px', visibility: index === 0 ? 'hidden' : 'visible' }}
/>
</div>
</div>
))}
<Button
type="dashed"
onClick={handleAdd}
style={{ width: '100%' }}
icon={<PlusOutlined />}
disabled={maxLength && dataList && dataList.length && dataList.length >= maxLength}
>
新增阶梯
</Button>
</div>
);
}; export default Condition;

  

.m-condition {
&::-webkit-scrollbar {
width: 4px;
} &::-webkit-scrollbar-thumb {
background: #e3e8ee;
border-radius: 10px;
} &::-webkit-scrollbar-track-piece {
background: transparent;
}
}

  

引用:

在存储表单组件的dataSource数组时,遍历render:
if (el.id === 'xxx') {
return {
...el,
renderFormItem: () => <Condition />,
};
}

 

传递的数据格式为:

react+antd 开发一个可动态增减的复合组件的更多相关文章

  1. 【React】开发一个城市选择控件

    想到做这个,是因为无意中在github上看到了这一个仓库https://github.com/lunlunshiwo/ChooseCity,做的就是一个城市选择控件,是用vue写的,说的是阿里的一道题 ...

  2. React + Antd开发模式下的Excel导入功能

    具体js如下,配合的是antd里面的upload组件,使用的是xlsx插件 npm :  npm install xlsx 插件链接: https://github.com/SheetJS/sheet ...

  3. React Native 开发豆瓣评分(七)首页组件开发

    首页内容拆分 看效果图,首页由热门影院.豆瓣热门.热门影视等列表组成,每个列表又由头加横向滑动的 电影海报列表构成. 所以可以先把页面的电影海报.评分.列表头做成组件,然后在使用 ScrollView ...

  4. 放弃antd table,基于React手写一个虚拟滚动的表格

    缘起 标题有点夸张,并不是完全放弃antd-table,毕竟在react的生态圈里,对国人来说,比较好用的PC端组件库,也就antd了.即便经历了2018年圣诞彩蛋事件,antd的使用者也不仅不减,反 ...

  5. react+antd 使用脚手架动态修改主题色

    最近做了一个需求,后台管理系统添加一个可以动态修改ant-design主题色.查询了大多数的文章,发现基本都是抄来抄去,而且文章记录的也一点也不详细.刚刚把这个功能做完了,顺便记录一下如何去修改主题色 ...

  6. 从0到1用react+antd+redux搭建一个开箱即用的企业级管理后台系列(基础篇)

    背景 ​ 最近因为要做一个新的管理后台项目,新公司大部分是用vue写的,技术栈这块也是想切到react上面来,所以,这次从0到1重新搭建一个react项目架子,需要考虑的东西的很多,包括目录结构.代码 ...

  7. DECO 一个REACT NAtive 开发IDE工具

    DECO 一个REACT NAtive 开发IDE工具. 目前只支持 OS,NO WINDOWS https://www.decosoftware.com/ 一个方便的快速 ERXPRESS 教程:h ...

  8. 使用React、Node.js、MongoDB、Socket.IO开发一个角色投票应用的学习过程(三)

    这几篇都是我原来首发在 segmentfault 上的地址:https://segmentfault.com/a/1190000005040834 突然想起来我这个博客冷落了好多年了,也该更新一下,呵 ...

  9. (24/24) webpack小案例--自己动手用webpack构建一个React的开发环境

    通过前面的学习,对webpack有了更深的认识,故此节我们就利用前面相关知识自己动手用webpack构建一个React的开发环境,就算是一个小案例吧. 注:此处使用的开发工具是Webstorm. 1. ...

  10. react + react-router + less +antd 开发环境

    react + react-router + less +antd 开发环境搭建 1.基于create-reacte-app,需要先安装这个脚手架,然后初始化项目. 2.进入项目目录,首先 npm r ...

随机推荐

  1. 【uboot 】uboot通过tftp下载内核

    1.开发板uboot,虚拟机能相互ping通 2.ubuntu搭建好tftp服务器,设置好文件夹,放置好文件 sudo apt install tftpd-hpa  //安装服务程序 sudo sys ...

  2. ServiceEntry与WorkloadEntry

    ServiceEntry: 用于将未能自动添加至网格中的服务,以手形式使得内发 现机制能够访问或路由到这些服务.网格外部的服务       运行于 Kubernetes 上,但却非为 Istio 网格 ...

  3. 通过系统函数分配内存sbrk/sbrk

    #include <unistd.h> #include <stdio.h> int main(void) { printf("================brk ...

  4. windows远程桌面之前用于连接到xxx的凭据无法工作

    使用windows远程桌面连接时报错提示: 之前用于连接到xxx的凭据无法工作 确认输入的用户名密码没有问题 解决方法: 打开gpedit.msc组策略管理,依次找到 计算机配置 > windo ...

  5. build opencv with qt to make debugging easier

    最近发现使用自己编译的opencv,可以增强opencv的imshow函数功能.从哪里得到的线索已经忘记了.可能是无意中发现的某一张截图吧. 要实现cv::imshow函数功能增强,需要在cmake中 ...

  6. spring boot2 jpa分页查询百万级数据内存泄漏

    分页查询百万级数据,查询处理过程中发现内存一直飙升,最终处理程序会挂掉,通过jvisualvm可以发现频繁ygc 和fgc ,另外通过 jmap -histo:live ${pid} 命令可以看到jp ...

  7. 配置中包含maven属性,在idea中本地启动无法正常获取配置

    1. 本地启动一个spring cloud 项目,无法启动 (注:测试环境正常),且控台无错误日志. 分析:debug 代码发现是配置无法获取. 查看配置获取方式 是 spring config 通过 ...

  8. Spring-XML文件与注解

    (一)基于XML的使用 (二)基于注解和XML的混合使用

  9. knife4j 整合springboot

    1.添加依赖 <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife ...

  10. URAL2127 Determinant of a Graph 题解

    这个题真的折磨了我超久的.全网几乎搜不到一个详细的题解,俺来写写吧. 题意:给你一个无自环无重边的连通无向图,求它邻接矩阵的行列式的值. \(n\le 2*10^5,n-1\le m \le n+50 ...