当前位置:首页 > React

react antd表格中如何进行编辑

2026-01-26 07:19:22React

使用 FormTable 结合实现编辑

Tablecolumns 中,通过 render 方法动态切换显示和编辑状态。编辑状态时,使用 Form.Item 包裹输入组件(如 InputSelect),并通过 form.setFieldsValueform.getFieldsValue 管理数据。

import { Table, Input, Button, Form } from 'antd';

const EditableTable = () => {
  const [form] = Form.useForm();
  const [editingKey, setEditingKey] = useState('');
  const [data, setData] = useState(initialData);

  const isEditing = (record) => record.key === editingKey;

  const edit = (record) => {
    form.setFieldsValue({ ...record });
    setEditingKey(record.key);
  };

  const save = async (key) => {
    try {
      const values = await form.validateFields();
      const newData = [...data];
      const index = newData.findIndex((item) => key === item.key);
      newData[index] = { ...newData[index], ...values };
      setData(newData);
      setEditingKey('');
    } catch (err) {
      console.error('Validate Failed:', err);
    }
  };

  const columns = [
    {
      title: 'Name',
      dataIndex: 'name',
      render: (_, record) => {
        if (isEditing(record)) {
          return (
            <Form.Item name="name" rules={[{ required: true }]}>
              <Input />
            </Form.Item>
          );
        }
        return record.name;
      },
    },
    {
      title: 'Action',
      render: (_, record) => {
        if (isEditing(record)) {
          return (
            <Button onClick={() => save(record.key)} type="primary">
              Save
            </Button>
          );
        }
        return <Button onClick={() => edit(record)}>Edit</Button>;
      },
    },
  ];

  return (
    <Form form={form} component={false}>
      <Table columns={columns} dataSource={data} />
    </Form>
  );
};

使用 editable 属性实现行内编辑

通过 Tablecomponents 属性自定义单元格为可编辑状态。结合 onCell 方法动态控制编辑行为,适用于行内直接修改的场景。

import { Table, Input } from 'antd';

const EditableCell = ({ editing, dataIndex, children, ...restProps }) => {
  return (
    <td {...restProps}>
      {editing ? (
        <Input defaultValue={children[1]} />
      ) : (
        children
      )}
    </td>
  );
};

const EditableTable = () => {
  const [editingKey, setEditingKey] = useState('');

  const columns = [
    {
      title: 'Name',
      dataIndex: 'name',
      onCell: (record) => ({
        editing: record.key === editingKey,
        dataIndex: 'name',
      }),
    },
    {
      title: 'Action',
      render: (_, record) => (
        <Button onClick={() => setEditingKey(record.key)}>
          Edit
        </Button>
      ),
    },
  ];

  return (
    <Table
      components={{ body: { cell: EditableCell } }}
      columns={columns}
      dataSource={data}
    />
  );
};

使用 pro-table 快速实现编辑

若项目中使用 @ant-design/pro-table,可直接通过 editable 属性配置表格编辑功能,无需手动管理状态。

react antd表格中如何进行编辑

import ProTable from '@ant-design/pro-table';

const EditableTable = () => {
  return (
    <ProTable
      columns={[
        { title: 'Name', dataIndex: 'name', editable: true },
        { title: 'Age', dataIndex: 'age', editable: true },
      ]}
      value={data}
      editable={{
        onSave: async (key, row) => {
          console.log(key, row);
        },
      }}
    />
  );
};

注意事项

  • 表单验证:通过 Form.Itemrules 属性定义校验规则,确保数据合法性。
  • 性能优化:大数据量时,避免频繁渲染,可通过 shouldUpdatememo 优化组件。
  • 数据同步:编辑后需手动更新数据源,避免直接修改原始数据。

标签: 表格编辑
分享给朋友:

相关文章

css表格制作

css表格制作

CSS 表格制作基础 使用 CSS 可以创建美观且响应式的表格。以下是一些基本方法: table 元素用于定义表格,tr 定义行,td 定义单元格,th 定义表头单元格。 <table>…

vue实现表格拖动列宽

vue实现表格拖动列宽

实现表格列宽拖动的核心思路 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽逻辑,动态修改列宽。需要处理表头与表体的联动,确保拖动时视觉一致。 基础HTML结构 &…

vue实现分组表格

vue实现分组表格

Vue 实现分组表格的方法 使用 v-for 嵌套循环实现分组 通过嵌套的 v-for 循环可以轻松实现分组表格。外层循环遍历分组数据,内层循环遍历每组中的具体项。 <template>…

vue实现表格滚动

vue实现表格滚动

Vue 实现表格滚动的方法 使用 CSS 固定表头并滚动内容 通过 CSS 设置表格容器的固定高度和 overflow-y: auto,实现内容区域的滚动。表头部分使用 position: stick…

vue实现横向表格

vue实现横向表格

横向表格的实现方法 在Vue中实现横向表格,可以通过调整CSS样式和数据结构来实现。横向表格与常规表格的区别在于数据的展示方向,通常需要将表头和数据行进行转置。 使用CSS Flex布局 通过Fle…

vue实现表格合并

vue实现表格合并

实现表格合并的方法 在Vue中实现表格合并通常涉及对表格数据的处理和单元格属性的动态绑定。以下是几种常见的方法: 使用rowspan和colspan属性 通过计算需要合并的行或列数,动态绑定rows…