基于antd pro editTable进行封装公共组件

文章介绍了基于antdproeditTable的组件封装过程,从0.0版本到2.0版本的改进,包括高度自适应、请求体管理、类型属性引入和更标准的ts使用。同时指出了代码规范和功能简化的不足之处。

组件封装

基于antd pro editTable进行封装公共组件

0.0版本,所有参数都由子组件进行传值,父组件作为接收,不做任何的处理。
实现表格高度自适应
/**
 * @description 公共table v0
 * @version: 2023-12-11 11:06:31
 */
import { setScrollY } from "@/utils";
import { EditableProTable } from "@ant-design/pro-table";

export default ({ ...resetProps }) => {
  const tableHeight = setScrollY(); //表格自适应高度
  return (
    <div>
      <EditableProTable
        {...resetProps}
        scroll={{ y: tableHeight ? tableHeight : 400 }}
      />
    </div>
  );
};

分析不足:

  1. 增加的表格高度配置默认对所有组件都开放了(不符合组件封装规范,所有自定义配置都要支持关闭)
  2. 在公共函数src\utils\index.ts中使用了hook:不符合hook使用规范。
  3. 表格请求loadData很多页面是共性的,可以离到公共组件中。
  4. 默认配置initTableConfig 可以抽离到公共组件中
1.0版本

WebTable1.0优化内容

(1)引入官方组件的类型属性
(2)将表格请求方法定义在父组件内,子组件只需要传输一个api将接口传到父组件进行执行搜索查询
(3)根据业务规则,需额外增加查询参数,增加transformRequest函数进行增加其他需要的参数传值
(4)将统一的参数值tableLoading、setTableLoading、initTableConfig(表格配置)、className(样式名)定义在父组件内


 import { setScrollY } from "@/utils";
import { EditableProTable } from "@ant-design/pro-table";
import * as Utils from "@/utils";
import { ProTableProps } from "@ant-design/pro-table";
import { useState } from "react";
import initTableConfig from "@/config/init-table-config";

interface resetPropsType extends ProTableProps<any, any> {
  // 其他自定义props...
  actionRef: any;
  api: any;//请求体
  rowKey?: string;
  maxLength?: number;//最大长度
  headerTitle?: string;//表格标题
  transformRequest?: (data: any, params?: any) => void;
}
export default ({
  api,//请求体
  rowKey = "id",//行key
  maxLength,//数据最大长度
  transformRequest,//参数请求修改
  ...resetProps//剩余属性
}: resetPropsType) => {
  const tableHeight = setScrollY(); //表格自适应高度
  const [config, setConfig] = useState(initTableConfig); // 表格配置
  const [tableLoading, setTableLoading] = useState<boolean>(false); //表格加载
  const requestData = async ({
    current: num,
    pageSize: size,
    ...resetQuestParams
  }) => {
   let obj = await Utils.RemoveSpaces({
      num,
      size,
      ...resetQuestParams,
    });
    setTableLoading(true);
    const res = await Utils.handleRes({
      api: api,
      data: transformRequest ? await transformRequest(obj) : obj,
    });
    setTableLoading(false);
    const configData = {
      ...config, // 使用展开运算符进行对象的浅拷贝
      tableData: res.datas,
      pagination: {
        ...config.pagination,
        total: res.total,
        current: num,
        pageSize: size,
      },
    };
    setConfig(configData);
    return {
      data: configData.tableData,
      success: true,
      total: configData.pagination.total,
    };
  };
  return (
    <div>
      <EditableProTable
        {...config}
        {...resetProps}
        className="comomTable"
        rowKey={rowKey}
        loading={tableLoading}
        request={requestData}
        scroll={{ y: tableHeight ? tableHeight : 400 }}
      />
    </div>
  );
};

不足:ts书写规范有待提高,代码进行优化,抽离公共函数

2.0版本

import { autoTableHight } from "@/utils";
import { EditableProTable } from "@ant-design/pro-table";
import { ProTableProps } from "@ant-design/pro-table";
import { useState } from "react";
import initTableConfig from "@/config/init-table-config";
import {useTableRequest} from "@/hooks/config/useTableRequest";

interface resetPropsType extends ProTableProps<any, any> {
  // 其他自定义props...
  actionRef: any;
  api: any; //请求体
  rowKey?: string;
  maxLength?: number; //最大长度
  headerTitle?: string; //表格标题
  transformRequest?: (data: any, params?: any) => void;
}
export default ({
  api, //请求体
  rowKey = "id", //行key
  maxLength, //数据最大长度
  transformRequest, //参数请求修改
  ...resetProps //剩余属性
}: resetPropsType) => {
  const tableHeight = autoTableHight(); //表格自适应高度
  const [config, setConfig] = useState(initTableConfig); // 表格配置
  const [tableLoading, setTableLoading] = useState<boolean>(false); //表格加载
  const tableRequest = useTableRequest({
    setTableLoading,
    setConfig,
    transformRequest,
    config,
    api,
    ...resetProps,
  });
   return (
    <div>
      <EditableProTable
        {...config}
        {...resetProps}
        className="comomTable"
        rowKey={rowKey}
         loading={tableLoading}
        request={tableRequest}
        scroll={{ y: tableHeight ? tableHeight : 400 }}
      />
    </div>
  );
};
//hooks
import { ProTable } from "@ant-design/pro-table";
import { useEffect, useState } from "react";
import * as Utils from "@/utils";

type TypeProps = {
  setTableLoading: (data: boolean) => void; //标题
  transformRequest?: (data: any) => void; //其他请求参数
  setConfig: (data: any) => void; //
  config: (data: any) => void;
  api: (data: any) => void; //请求体
};
//表格请求方法
export function useTableRequest({
  setTableLoading,
  api,
  transformRequest,
  config,
  setConfig,
  ...resetProps
}: TypeProps) {
 useEffect(() => {}, []);
  const requestData = async ({
    current: num,
    pageSize: size,
    ...resetQuestParams
  }) => {
    let obj = await Utils.RemoveSpaces({
      num,
      size,
      ...resetQuestParams,
    });
    setTableLoading(true);
    const res = await Utils.handleRes({
      api: api,
      data: transformRequest ? await transformRequest(obj) : obj,
    });
     setTableLoading(false);
    const configData = {
      ...config, // 使用展开运算符进行对象的浅拷贝
      tableData: res.datas,
      pagination: {
        ...config.pagination,
        total: res.total,
        current: num,
        pageSize: size,
      },
    };
    setConfig(configData);
    return {
      data: configData.tableData,
      success: true,
      total: configData.pagination.total,
    };
  };
  return requestData;
}

不足:业务逻辑简单,表格组件功能简单。代码书写不规范

<think>好的,我现在要帮助用户了解Ant Design Pro的Editable Table。首先,我需要回忆一下Ant Design Pro的相关知识。Ant Design Pro是基于Ant Design和Umi框架的企业级中后台前端解决方案,而Editable Table是可编辑表格组件,常用于数据管理场景。 用户可能想知道Editable Table的基本用法、配置方法以及常见问题的解决方案。需要分步骤解释,结构清晰。先介绍基本概念,然后逐步讲解如何实现,包括代码示例和配置项说明。 接下来,我需要确保内容准确。比如,Editable Table是基于Ant Design的Table和Form组件封装的,所以需要提到如何结合使用这两个组件。同时,Ant Design Pro的版本可能会影响具体实现,但用户可能使用的是较新版本,所以应该基于最新的文档来说明。 要覆盖的主要点包括:如何定义列、启用编辑状态、处理数据保存、表单验证等。可能还需要提到行内编辑和弹出框编辑两种模式,以及如何切换不同的表单控件,比如输入框、选择器等。 需要注意用户的代码示例是否正确,比如使用useRef或useState来管理数据源,editable中的配置项如type、editable等。同时,要提醒用户关于数据提交和保存的逻辑,可能需要与后端API交互,这里要强调前端部分如何处理。 可能用户在使用时会遇到问题,比如表单验证不生效,或者保存数据时状态更新不正确。这时候需要给出常见问题排查的建议,比如检查form属性是否正确绑定,或者确保onValuesChange正确更新状态。 最后,确保使用中文,避免技术术语翻译不当,保持口语化但专业。结构上先概述,再分步骤详细说明,最后给出总结和参考资料,帮助用户进一步学习。</think>Ant Design Pro 的 Editable Table(可编辑表格)是基于 Ant Design Table 和 Form 组件封装的高阶组件,常用于实现表格行内编辑功能。以下将从实现原理、使用场景和代码示例三个层面进行解析: 一、核心实现原理 1. 数据驱动:通过 `dataSource` 属性管理表格数据 2. 表单集成:使用 `form` 属性绑定 Form 实例实现双向绑定 3. 状态控制:`editableKeys` 控制当前处于编辑状态的行标识 4. 渲染策略:通过 `render` 函数动态切换单元格的展示/编辑模式 二、典型使用场景 1. 商品价格批量编辑 2. 用户信息快速修改 3. 配置参数动态调整 4. 数据仪表盘即时更新 三、基础代码示例 ```typescript import { EditableProTable } from '@ant-design/pro-components'; const Demo = () => { const [dataSource, setDataSource] = useState([]); const [editableKeys, setEditableKeys] = useState([]); const columns = [ { title: '姓名', dataIndex: 'name', editable: (text, record, index) => index === 0 // 控制可编辑条件 }, { title: '年龄', dataIndex: 'age', valueType: 'digit' // 自动验证数字类型 } ]; return ( <EditableProTable rowKey="id" columns={columns} value={dataSource} onChange={setDataSource} editable={{ editableKeys, onSave: async (key, row) => { /* 保存逻辑 */ }, onChange: setEditableKeys }} /> ); }; ``` 四、进阶配置技巧 1. 验证规则:通过 `formItemProps` 设置字段校验规则 ```typescript { dataIndex: 'email', formItemProps: { rules: [{ type: 'email', message: '请输入有效邮箱' }] } } ``` 2. 自定义控件:使用 `renderFormItem` 实现复杂输入 ```typescript { dataIndex: 'gender', renderFormItem: () => ( <Select options={[ { label: '男', value: 'male' }, { label: '女', value: 'female' } ]}/> ) } ``` 五、常见问题排查 1. 数据更新延迟:确保使用 `useState` 或 `useRef` 管理数据源 2. 验证不生效:检查 `valueType` 是否与数据类型匹配 3. 编辑状态冲突:合理设置 `editableKeys` 的互斥逻辑 4. 性能优化:对大数据量场景使用虚拟滚动配置 建议结合官方文档(procomponents.ant.design/components/editable-table)进行实践,可通过 Storybook 示例快速掌握不同交互模式。实际开发中需注意数据序列化问题和防抖处理,特别是在频繁保存的场景下。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值