react+ts+hook封装一个table分页组件(建议收藏,直接使用)

简介: react+ts+hook封装一个table分页组件(建议收藏,直接使用)

封装准备(多看官网)

jsx风格的api

<>
    <Table<User> columns={columns} dataSource={data} />
    /* 使用 JSX 风格的 API */
    <Table<User> dataSource={data}>
      <Table.Column<User> key="name" title="Name" dataIndex="name" />
    </Table>
  </>

模拟jsx的api结构

<Card style={{ marginTop: '24px' }}>
            <Table<any>
                {...resetProps}
                onChange={onTableChange}
                dataSource={list}
                rowKey={record => `${record.id}`}
                pagination={{
                    pageSizeOptions: ['5', '10', '20', '50'],
                    ...pagination,
                    total: page.dataTotal,
                    showTotal: () => {
                        return '共 ' + page.dataTotal + ' 条记录';
                    },
                }}
            >
                {props.children}
            </Table>
        </Card>

分页参数官方api

<Pagination
      total={85}
      showTotal={(total, range) => `${range[0]}-${range[1]} of ${total} items`}
      defaultPageSize={20}
      defaultCurrent={1}
    />

image.png


解析

rowKey表示唯一标识 区当前行的idresetProps表示剩余参数


onTableChange回调 子传父

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


把分页参数传给父级


ts限定

interface BaseTableProps<T> extends TableProps<T> {
    data: {
        list: T[];
        page: PageResponseData;
    };
    children: React.ReactNode;
    onChange: (page: PaginationProps) => void;
}





默认状态

const {
        data: { list, page },
        ...resetProps
    } = props;
    const [pagination, setPagination] = useState<PaginationProps>({
        defaultCurrent: 1,
        defaultPageSize: 10,
        showSizeChanger: true,
    });


总体封装代码

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";
import { type } from 'os';
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={{
                    pageSizeOptions: ['5', '10', '20', '50'],
                    ...pagination,
                    total: page.dataTotal,
                    showTotal: () => {
                        return '共 ' + page.dataTotal + ' 条记录';
                    },
                }}
            >
                {props.children}
            </Table>
        </Card>
    );
}
export default BasicTable;

使用方法

<BasicTable data={menuData} onChange={onTableChange} loading={loading}>
                <Table.Column<Menu> title="设备类型" dataIndex="machineTypeName" align="center"
                 render={(text, record:any, index) => (
                    <span>{record?.t_device_machine_type?.machine_type_name}</span>
                )}
                ></Table.Column>
                <Table.Column<Menu> title="设备名称" dataIndex="name" align="center"></Table.Column>
                <Table.Column<Menu> title="设备编码" dataIndex="code" align="center"></Table.Column>
                <Table.Column<Menu>
                    title="添加时间"
                    dataIndex="register_date"
                    align="center"
                    render={(text, record, index) => (
                        <span>{countFormat(text)}</span>
                    )}
                ></Table.Column>
                <Table.Column<Menu>
                    title="修改时间"
                    dataIndex="update_date"
                    align="center"
                    render={(text, record, index) => (
                        <span>{countFormat(text)}</span>
                    )}
                ></Table.Column>
                <Table.Column<Menu>
                    title="操作"
                    align="center"
                    render={(text, record, index) => (
                        <MenuButton index={index} record={record} onButtonClick={onButtonClick} />
                    )}
                ></Table.Column>
            </BasicTable>

解析

子传父分页回调


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



loading表格是否渲染完成


演示结果

image.png


image.png

相关文章
|
前端开发 JavaScript 网络架构
react对antd中Select组件二次封装
本文介绍了如何在React中对Ant Design(antd)的Select组件进行二次封装,包括创建MSelect组件、定义默认属性、渲染Select组件,并展示了如何使用Less进行样式定义和如何在项目中使用封装后的Select组件。
734 2
react对antd中Select组件二次封装
|
前端开发
React添加路径别名alias、接受props默认值、并二次封装antd中Modal组件与使用
本文介绍了在React项目中如何添加路径别名alias以简化模块引入路径,设置组件props的默认值,以及如何二次封装Ant Design的Modal组件。文章还提供了具体的代码示例,包括配置Webpack的alias、设置defaultProps以及封装Modal组件的步骤和方法。
432 1
React添加路径别名alias、接受props默认值、并二次封装antd中Modal组件与使用
|
前端开发
react 封装防抖
react 封装防抖
181 4
封装react-antd-table组件参数以及方法如rowSelection、pageNum、pageSize、分页方法等等
文章介绍了如何封装React-Antd的Table组件,包括参数和方法,如行选择(rowSelection)、页码(pageNum)、页面大小(pageSize)、分页方法等,以简化在不同表格组件中的重复代码。
542 1
|
前端开发
React 中的 Hook 概念
【8月更文挑战第31天】
345 0
|
前端开发
Vue3 【仿 react 的 hook】封装 useTitle
Vue3 【仿 react 的 hook】封装 useTitle
241 0
|
前端开发 API
Vue3 【仿 react 的 hook】封装 useLocation
Vue3 【仿 react 的 hook】封装 useLocation
238 0
|
7月前
|
缓存 前端开发 JavaScript
React Hooks深度解析与最佳实践:提升函数组件能力的终极指南
🌟蒋星熠Jaxonic,前端探索者。专注React Hooks深度实践,从原理到实战,分享状态管理、性能优化与自定义Hook精髓。助力开发者掌握函数组件的无限可能,共赴技术星辰大海!
React Hooks深度解析与最佳实践:提升函数组件能力的终极指南
|
缓存 前端开发 数据安全/隐私保护
如何使用组合组件和高阶组件实现复杂的 React 应用程序?
如何使用组合组件和高阶组件实现复杂的 React 应用程序?
417 68
|
缓存 前端开发 Java
在 React 中,组合组件和高阶组件在性能方面有何区别?
在 React 中,组合组件和高阶组件在性能方面有何区别?
363 67