当前位置:网站首页>Antd-ProComponents中的EditableProTable无法在子行继续新增子子行的临时解决方案
Antd-ProComponents中的EditableProTable无法在子行继续新增子子行的临时解决方案
2022-08-02 16:10:00 【曲鸟】
一、BUG效果如下
点击后报错:
二、复现代码
import {
EditableProTable } from '@ant-design/pro-table';
import React, {
useState } from 'react';
const defaultData: any = new Array(3).fill(1).map((_, index) => {
return {
id: (Date.now() + index).toString(),
title: `活动名称${
index}`,
decs: '这个活动真好玩',
state: 'open',
created_at: '2020-05-26T09:42:56Z',
};
});
export default () => {
const [editableKeys, setEditableRowKeys] = useState<React.Key[]>(() =>
defaultData.map((item) => item.id),
);
const [dataSource, setDataSource] = useState<any[]>(() => defaultData);
const columns: any = [
{
title: '活动名称',
dataIndex: 'title',
width: '30%',
formItemProps: {
rules: [
{
required: true,
whitespace: true,
message: '此项是必填项',
},
{
message: '必须包含数字',
pattern: /[0-9]/,
},
{
max: 16,
whitespace: true,
message: '最长为 16 位',
},
{
min: 6,
whitespace: true,
message: '最小为 6 位',
},
],
},
},
{
title: '状态',
key: 'state',
dataIndex: 'state',
valueType: 'select',
valueEnum: {
all: {
text: '全部', status: 'Default' },
open: {
text: '未解决',
status: 'Error',
},
closed: {
text: '已解决',
status: 'Success',
},
},
},
{
title: '描述',
dataIndex: 'decs',
},
{
title: '操作',
valueType: 'option',
width: 250,
render: () => {
return null;
},
},
];
return (
<>
<EditableProTable<any>
headerTitle="可编辑表格"
columns={
columns}
rowKey="id"
scroll={
{
x: 960,
}}
value={
dataSource}
onChange={
setDataSource}
recordCreatorProps={
{
newRecordType: 'dataSource',
position: 'bottom',
record: () => ({
id: Date.now(),
}),
}}
editable={
{
type: 'multiple',
editableKeys,
actionRender: (row, config, defaultDoms) => {
return [defaultDoms.delete,
<EditableProTable.RecordCreator
parentKey={
row.id}
newRecordType='dataSource'
position='bottom'
record={
{
id: Date.now(),
}}
>
<a>增加子行</a>
</EditableProTable.RecordCreator>];
},
onValuesChange: (record, recordList) => {
setDataSource(recordList);
},
onChange: setEditableRowKeys,
}}
/>
</>
);
};
三、解决方案
自己写一个递归的方法将子行追加到选中行下即可,下面展示的是我项目中的代码,不能复制直接用,但思路是一样的。
首先在actionRender
中自定义“增加子行”的操作按钮,其中addChildToSource
为增加逻辑方法:
actionRender: (row, _, dom) => [
<a
key="addChild"
onClick={
() => addChildToSource(row.id, type)}
>
增加子行
</a>
],
addChildToSource代码如下:
//增加子行
const addChildToSource = (rowKey: any, type: string) => {
let childRowKey = Date.now(); //rowkey的id不能重复,不然会回填异常
editableKeys[type].push(childRowKey);
let source = formRef.current.getFieldValue(`${
type}_source`); //type_source为表格定义的formItem的name
source = addChildToSourceFunc(source, rowKey, childRowKey, type);
const _dict = {
};
_dict[`${
type}_source`] = source;
formRef.current.setFieldsValue(_dict);
setEditableKeys({
...editableKeys });
};
上述方法调用的addChildToSourceFunc代码如下:
//删除参数edit及子级edit
const addChildToSourceFunc = (
source: any,
rowKey: any,
childRowKey: any,
type: string,
childName: any = null,
) => {
for (var i = 0; i < source.length; i++) {
const sourceItem = source[i];
if (sourceItem.id === rowKey) {
if (!sourceItem.children) {
sourceItem.children = [];
}
sourceItem.children.push({
id: childRowKey, required: true, param_type: 'string', name: childName });
break;
} else if (sourceItem.children) {
addChildToSourceFunc(sourceItem.children, rowKey, childRowKey, type, childName,);
}
}
return source;
};
成功解决了该问题,解决后的效果:
边栏推荐
猜你喜欢
【2022河南萌新联赛第(四)场:郑州轻工业大学】【部分思路题解+代码解析】
坚持自主创新 线控底盘领军企业英创汇智获数亿元B+轮融资
【[SCOI2005] 互不侵犯】【状压DP(含概念讲解)】
看我如何用多线程,帮助运营小姐姐解决数据校对系统变慢!
打破千篇一律,DIY属于自己独一无二的商城
【无标题】
[LeetCode]剑指 Offer 55 - I. 二叉树的深度
使用 LaunchPad 上的 TAO 工具包体验轻松创建 AI 模型
20 Lectures on Disassembly of Multi-merchant Mall System Functions-Platform Distribution Overview
2.5 - 死锁
随机推荐
11.1-CM24 最近公共祖先
CefSharp practical demonstration
领导无线边缘AI的联合神经形态学习,具有较高的识别精度以及较低的能耗
带你了解MySQL数据库
DSP-ADAU1452参考音设置方法
网御数据库审计系统配置Radius启用双因素/双因子(2FA/MFA)身份认证
11.2-HJ86 求最大连续bit数
8大软件供应链攻击事件概述
智能座舱供应链的“新主角”
看我如何用多线程,帮助运营小姐姐解决数据校对系统变慢!
julia系列1:介绍与安装
一文搞懂│php 中的 DI 依赖注入
【暑期集训第一周:搜索】【DFS&&BFS】
每日练习------定义一个N*N二维数组,从键盘上输入值,找出每行中最大值组成一个一维数组并输出;
想要白嫖正则是吧?这一次给你个够!
一文搞懂│php 中的 DI 依赖注入
[LeetCode]剑指 Offer 32 - II. 从上到下打印二叉树 II
JZ4 二维数组中的查找
Qt reads Json files (including source code + comments)
【学术相关】北大一研究生偷取同门师妹论文发表,作者却挂名给了武大 3 位不知情的学生......