当前位置:首页 > React

react antd表格中如何进行编辑

2026-01-26 07:19:22React

使用 FormTable 结合实现编辑

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

react antd表格中如何进行编辑

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 属性配置表格编辑功能,无需手动管理状态。

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 优化组件。
  • 数据同步:编辑后需手动更新数据源,避免直接修改原始数据。

react antd表格中如何进行编辑

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

相关文章

vue日历表格实现

vue日历表格实现

实现Vue日历表格的基本步骤 使用Vue实现日历表格需要处理日期数据生成、渲染和交互逻辑。以下是核心实现方法: 安装依赖(可选) 若需复杂功能可引入date-fns或dayjs等日期库: npm…

css表格制作

css表格制作

CSS表格制作方法 使用CSS创建表格可以通过多种方式实现,以下是常见的几种方法: 使用HTML原生表格标签结合CSS样式 <table class="styled-table">…

elementui编辑

elementui编辑

Element UI 编辑功能实现方法 Element UI 提供了丰富的组件支持数据编辑操作,常见场景包括表格行内编辑、表单编辑、对话框编辑等。 表格行内编辑 使用 el-table 结合 el…

vue实现编辑状态

vue实现编辑状态

Vue 实现编辑状态的方法 在 Vue 中实现编辑状态通常涉及数据绑定、状态管理和事件处理。以下是几种常见的方法: 使用 v-model 绑定数据 通过 v-model 实现双向数据绑定,结合 v-…

vue实现表格刷新

vue实现表格刷新

Vue 实现表格刷新的方法 使用 v-if 强制重新渲染 通过 v-if 控制表格的显示与隐藏,切换时 Vue 会重新渲染组件。 <template> <button @cli…

vue如何实现编辑

vue如何实现编辑

实现编辑功能的步骤 在Vue中实现编辑功能通常涉及表单绑定、状态管理和事件处理。以下是常见的实现方式: 数据绑定与表单处理 使用v-model实现双向数据绑定,将编辑内容与Vue实例中的数据属性关…