React+hook+ts+ant design封装一个table的组件

简介: React+hook+ts+ant design封装一个table的组件

需求分析

在前端项目中 最常见的就是封装一个table的一个功能

功能思维image.png

初始化版本(基础样式和分页)

<Table<any>
                {...resetProps}
                onChange={onTableChange}
                dataSource={list}
                rowKey={record => `${record.id}`}
                pagination={{
                    ...pagination,
                    total: page.dataTotal,
                    showTotal: () => {
                        return '共 ' + page.dataTotal + ' 条记录';
                    },
                }}
            >
                {props.children}
            </Table>

resetProps额外属性

onChange={onTableChange}分页切换

const onTableChange = useCallback((pageParams: PaginationProps) => {
        setPagination(pageParams);
        props.onChange(pageParams);
    }, []);

list 列表数据

pagination分页数据

props.children table中包裹的内容

升级版本(优化ts限制)

import React, { useCallback, useState } from 'react';
import { Table,Card } from 'antd';
import { PaginationProps } from 'antd/lib/pagination';
import { TableProps } from 'antd/lib/table';
import { PageResponseData } from './type';
import {isHKCard} from "@/utils/regexp";
interface BaseTableProps<T> extends TableProps<T> {
    data: {
        list: T[];
        page: PageResponseData;
    };
    children: React.ReactNode;
    onChange: (page: PaginationProps) => void;
}
const BasicTable: React.FC<any> = (props: BaseTableProps<any>) =>{
// function BasicTable<T extends { id?: number }>(props: BaseTableProps<T>) {
    const {
        data: { list, page },
        ...resetProps
    } = props;
    const [pagination, setPagination] = useState<PaginationProps>({
        defaultCurrent: 1,
        defaultPageSize: 10,
        showSizeChanger: true,
    });
    const onTableChange = useCallback((pageParams: PaginationProps) => {
        setPagination(pageParams);
        props.onChange(pageParams);
    }, []);
    return (
        <Card style={{ marginTop: '24px' }}>
            <Table<any>
                {...resetProps}
                onChange={onTableChange}
                dataSource={list}
                rowKey={record => `${record.id}`}
                pagination={{
                    ...pagination,
                    total: page.dataTotal,
                    showTotal: () => {
                        return '共 ' + page.dataTotal + ' 条记录';
                    },
                }}
            >
                {props.children}
            </Table>
        </Card>
    );
}
export default BasicTable;

type.ts

export type Partial<T> = {
    [P in keyof T]?: T[P];
};
export interface PageQueryParams {
    page: number;
    size: number;
}
export interface PageResponseData {
    dataTotal?: number;
    pageTotal?: number;
    page?: number;
    size?: number;
}
export interface QueryListResponseData<T> {
    list: T[];
    page: PageResponseData;
}

使用总结(父组件)

<BasicTable data={menuData} onChange={onTableChange} loading={loading}>
                <Table.Column<Menu> title="歌谣" dataIndex="empCode" align="center"></Table.Column>
                <Table.Column<Menu> title="歌谣" dataIndex="empName" align="center"
                ></Table.Column>
                <Table.Column<Menu> title="歌谣" dataIndex="machineName" align="center"
                ></Table.Column>
                <Table.Column<Menu> title="歌谣" dataIndex="gradle" align="center"
                ></Table.Column>
                <Table.Column<Menu> title="歌谣" dataIndex="registerDate" align="center"
                ></Table.Column>
                <Table.Column<Menu> title="歌谣" dataIndex="updateDate" align="center"></Table.Column>
                <Table.Column<Menu>
                    title="操作"
                    align="center"
                    render={(text, record, index) => (
                        <MenuButton index={index} record={record} onButtonClick={onButtonClick} />
                    )}
                ></Table.Column>
            </BasicTable>

loading 加载状态

onTableChange改变的回调

const onTableChange = useCallback(({ current, pageSize }: PaginationProps) => {
        setPage({ pageIndex: current as number, pageSize: pageSize as number });
    }, []);

menuData父传子的值

const [menuData, setMenuData] = useState<{ list: Menu[]; page: PageResponseData }>({
        list: [],
        page: {},
    });

总结

我是歌谣 放弃很容易 坚持一定很酷 关注前端小歌谣带你进入前端巅峰交流群

相关文章
|
8月前
|
Web App开发 存储 安全
macOS Sequoia 15.4.1 (24E263) Boot ISO 原版可引导镜像下载
macOS Sequoia 15.4.1,2025 年 4 月 17 日,仅问题修复和安全更新。
1271 6
macOS Sequoia 15.4.1 (24E263) Boot ISO 原版可引导镜像下载
|
9月前
|
算法 数据建模 应用服务中间件
阿里云2025智惠采购季,WoSign SSL证书优惠叠加使用攻略
阿里云2025智惠采购季,WoSign SSL证书折上折满减优惠!活动月期间(2025年03月01日至03月31日)活动折扣叠加满减优惠券,具体如何操作才能获取组合优惠价格呢?快来get优惠券组合使用攻略吧!
741 4
|
容器
深入理解 Flutter 鸿蒙版的 Stack 布局:适配屏幕与层叠样式布局
Flutter 的 Stack 布局组件允许你将多个子组件层叠在一起,实现复杂的界面效果。本文介绍了 Stack 的基本用法、核心概念(如子组件层叠、Positioned 组件和对齐属性),以及如何使用 MediaQuery 和 LayoutBuilder 实现响应式设计。通过示例展示了照片展示与文字描述、动态调整层叠布局等高级用法,帮助你构建更加精美和实用的 Flutter 应用。
570 2
|
JSON 数据格式 C++
VS Code debug调试时无法查看变量内容【已解决】
VS Code debug调试时无法查看变量内容【已解决】
VS Code debug调试时无法查看变量内容【已解决】
|
机器人 BI
伙伴客户案例|阿里云RPA携手中电金信赋能大型保险企业业务发展(二)
RPA全称机器人流程自动化(Robotic Process Automation),是一种新兴的“数字劳动力”,可以替代或辅助人完成规则明确的重复性劳动,大幅提升业务流程销量,实现企业业务流程的自动化和智能化,从而降本增效。目前,RPA解决方案的应用场景几乎涵盖了所有行业,包括银行、保险、制造、零售、医疗、物流、电子商务甚至政府和公共机构。
伙伴客户案例|阿里云RPA携手中电金信赋能大型保险企业业务发展(二)
EMQ
|
网络协议 物联网 测试技术
MQTT over QUIC:下一代物联网标准协议为消息传输场景注入新动力
解决车联网、移动终端等弱网场景下消息延迟与高连接开销问题
EMQ
904 1
MQTT over QUIC:下一代物联网标准协议为消息传输场景注入新动力
|
人工智能
电脑端sip软电话免费下载地址与使用说明(eyebeam)
VOS一件安装文档 与我联系 下载地址: 国内下载 http://47.98.241.45/outbound/Public/sip/eyeBeam.zip(eyebeam) 国内下载 sipphone.cc/phone_lite_… 国外下载 phone.ddrj.com/phone_lite_… 百度云下载 pan.baidu.com/s/1hs64Nbu 使用说明 启动软件 双击 phone.exe AI源码,VOS,SIP软件
2342 0
|
机器学习/深度学习 并行计算 监控
基于sklearn随机森林算法探究肥胖的成因(一)
基于sklearn随机森林算法探究肥胖的成因
1104 0
基于sklearn随机森林算法探究肥胖的成因(一)
|
移动开发 缓存 小程序