pro-components
pro-components copied to clipboard
🐛[BUG] EditableProTable 动态修改表格内字段,UI正确但数据不同步!
🐛 bug 描述
EditableProTable 动态修改表格内字段,UI正确但数据不同步!
📷 复现步骤
官网示例错误,地址:EditableProTable 与 FormItem 配合
💻 复现代码
// 可直接运行的错误示例代码 🔥🔥 👀
import type {
ActionType,
ProColumns,
ProFormInstance,
EditableFormInstance,
} from '@ant-design/pro-components';
import {
EditableProTable,
ProForm,
ProFormDependency,
ProFormField,
ProCard,
} from '@ant-design/pro-components';
import { Input, message, Button, Select } from 'antd';
import React, { useState, useRef } from 'react';
type DataSourceType = {
id: React.Key;
field1: string;
field2: string;
};
const defaultData: DataSourceType[] = [
{
id: 10,
} as DataSourceType,
];
export default () => {
const formRef = useRef<ProFormInstance>();
const editableFormRef = useRef<EditableFormInstance<DataSourceType>>();
const actionRef = useRef<ActionType>();
const [editableKeys, setEditableRowKeys] = useState<React.Key[]>(() =>
defaultData.map((item) => item.id),
);
const columns: ProColumns<DataSourceType>[] = [
{
title: '字段1',
dataIndex: 'field1',
renderFormItem: (_) => {
return (
<Input
placeholder="输入123后提交,看控制台"
onChange={(e) => {
editableFormRef.current?.setRowData?.(_.index!, {
field2: e.target.value,
});
}}
/>
);
},
},
{
title: '动态设置值的字段',
dataIndex: 'field2',
},
];
return (
<ProForm<{
dataSource: DataSourceType[];
}>
className="sr-form"
formRef={formRef}
request={() => {
return Promise.resolve({
dataSource: defaultData,
});
}}
onFinish={async (values) => {
await editableFormRef.current?.validateFields();
console.warn('输入123,拿到的 field2 却是 12');
console.log(values);
// message.success('提交成功');
}}
>
<ProForm.Item name="dataSource" trigger="onValuesChange">
<EditableProTable<DataSourceType>
actionRef={actionRef}
toolBarRender={() => [
<Button
type="primary"
onClick={() => {
actionRef.current?.addEditRecord?.(
{
id: Date.now(),
},
{
newRecordType: 'dataSource',
position: 'bottom',
},
);
}}
>
新增一行
</Button>,
]}
bordered
headerTitle={'页面上没问题,但是数据有问题'}
rowKey="id"
columns={columns}
recordCreatorProps={false}
editableFormRef={editableFormRef}
editable={{
type: 'multiple',
editableKeys,
onChange: setEditableRowKeys,
actionRender: (row, _, dom) => {
return [dom.delete];
},
}}
/>
</ProForm.Item>
<ProForm.Item>
<ProCard
title="🔴 拿到的表格数据错误,【请看 field2 字段的数据】❗️❗️👇👇"
headerBordered
collapsible
defaultCollapsed={false}
>
<ProFormDependency name={['dataSource']}>
{({ dataSource }) => {
return (
<ProFormField
ignoreFormItem
fieldProps={{
style: {
width: '100%',
},
}}
mode="read"
valueType="jsonCode"
text={JSON.stringify(dataSource)}
/>
);
}}
</ProFormDependency>
</ProCard>
</ProForm.Item>
</ProForm>
);
};
🚑 其他信息(gif 演示)
1. 官网demo的错误
2. 我遇到的错误演示
以下的 Issues 可能会帮助到你 / The following issues may help you
- [#5354][EditableProTable隐藏操作列👑 [需求]][61%]
同样问题,搞了两天,state在action里没有正确同步
确实,getFieldsValue 没有更新,getFieldValue 更新了
"@ant-design/pro-table": "2.78.3" 我的版本没问题