You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ProForm嵌套EditableProTable出现性能卡顿问题寻求解决方案

解决ProForm嵌入EditableProTable的性能卡顿问题

当在ProForm中嵌入EditableProTable时,仅60行数据就出现编辑卡顿,但单独使用EditableProTable或ProFormList处理同量数据时性能正常,核心原因是ProForm的全局状态更新会触发整个EditableProTable的全量重渲染,而ProFormList内部做了局部更新优化,单独使用EditableProTable时是维护局部状态,避免了全局重渲染的开销。

解决方案

1. 解耦表格状态与ProForm全局状态

单独维护EditableProTable的数据状态,避免表单全局更新触发表格全量重渲染,提交表单时再将表格数据合并到表单值中:

import { useState } from 'react';
import { ProForm, ProFormText } from '@ant-design/pro-form';
import { EditableProTable } from '@ant-design/pro-components';

// 初始化表格数据
const initialData = Array.from({ length: 60 }).map((_, i) => ({
  id: i,
  name: `行${i}`,
  value: `值${i}`,
}));

const columns = [
  {
    title: '名称',
    dataIndex: 'name',
    editable: true,
  },
  {
    title: '值',
    dataIndex: 'value',
    editable: true,
  },
];

const App = () => {
  // 局部维护表格数据
  const [tableData, setTableData] = useState(initialData);

  const handleSubmit = (formValues) => {
    // 提交时合并表格数据到表单结果
    const submitValues = {
      ...formValues,
      tableData,
    };
    console.log('提交数据:', submitValues);
    // 执行提交逻辑
  };

  return (
    <ProForm onFinish={handleSubmit}>
      <ProFormText name="formName" label="表单名称" />
      <EditableProTable
        value={tableData}
        onChange={setTableData}
        columns={columns}
        rowKey="id"
      />
    </ProForm>
  );
};

export default App;

2. 开启虚拟滚动减少渲染元素

给EditableProTable设置scroll={{ y: 固定高度 }},启用虚拟滚动特性,表格只会渲染可视区域内的行,大幅减少DOM元素数量和重渲染开销:

<EditableProTable
  value={tableData}
  onChange={setTableData}
  columns={columns}
  rowKey="id"
  scroll={{ y: 600 }} // 设置可视区域高度
/>

3. 优化列渲染组件的重渲染

将表格中可编辑单元格的渲染逻辑抽离为独立组件,并用React.memo包裹,避免无关更新触发单元格重渲染:

import { memo } from 'react';
import { ProFormText } from '@ant-design/pro-form';

// 用memo包裹,仅在props变化时重渲染
const EditableTextCell = memo(({ value, onChange, record }) => {
  return (
    <ProFormText
      value={value}
      onChange={(e) => onChange(record.id, 'value', e.target.value)}
    />
  );
});

// 在列配置中使用
const columns = [
  {
    title: '值',
    dataIndex: 'value',
    render: (text, record) => (
      <EditableTextCell
        value={text}
        onChange={(id, key, val) => {
          setTableData(prev => prev.map(item => 
            item.id === id ? { ...item, [key]: val } : item
          ));
        }}
        record={record}
      />
    ),
  },
];

4. 用ProFormField封装表格,手动控制字段更新

通过ProFormField自定义表单字段,手动关联表格数据与表单字段,减少全局表单状态对表格的影响:

<ProFormField
  name="tableData"
  initialValue={initialData}
  render={({ value, onChange }) => (
    <EditableProTable
      value={value}
      onChange={onChange}
      columns={columns}
      rowKey="id"
      scroll={{ y: 600 }}
    />
  )}
/>

总结

优先尝试状态解耦+虚拟滚动的组合方案,这两个措施能快速解决大部分场景下的性能卡顿问题;如果仍有优化空间,再结合单元格组件的memo优化进一步减少重渲染。

内容的提问来源于stack exchange,提问作者Merabtene

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 21:48:21