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

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

时间:2023-04-18 18:33:00浏览次数:44  
标签:const record title ts react hook props import page

前言

大家好 我是歌谣 我是一名坚持写博客四年的博主 最好的种树是十年前 其次是现在,今天继续对ant design 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}
    />

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

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

解析

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;
}

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

默认状态

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表格是否渲染完成

演示结果

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

总结

歌谣出品 必是精品 微信公众号关注前端小歌谣 带你进入巅峰人才交流群

标签:const,record,title,ts,react,hook,props,import,page
From: https://blog.51cto.com/u_14476028/6202375

相关文章

  • echarts相关问题
    解决echarts下钻地图,在平移和缩放后,下钻到下一级时生成的地图不在容器中间,会跑到容器外面去。 myChart.setOption(option,true)问题:echart地图三级下钻地图在平移和缩放后,点击到省,由于中心点的偏移,省跑到容器以外的地方去了,导致新生成的地图看不见。解决方法:后来发现,是重新绘制......
  • Vscode提示"Option 'importsNotUsedAsValues' is deprecated and will stop functioni
    完整错误如下。点击错误信息会定位到tsconfig.json和tsconfig.node.json两个文件。Option'importsNotUsedAsValues'isdeprecatedandwillstopfunctioninginTypeScript5.5.SpecifycompilerOption'"ignoreDeprecations":"5.0"'tosilencethis......
  • ITSS认证运维服务各等级申报要求与流程
    一、ITSS的定义ITSS是信息技术服务标准,InformationTechnologyServiceStandards的缩写。是在工业和信息化部、国家标准化委的领导和支持下,由ITSS工作组研制的一套IT服务领域的标准库和一套提供IT服务的方法论。二、ITSS认证适用对象金融与保险机构、互联网企业、电信运营商、工......
  • echarts柱状图横(x)轴文字显示不全,一招解决
    柱状图底部X轴文字过长时,将会出现文字显示不全的问题,这是echarts为了美观默认的设置现在我们把文章倾斜旋转点角度即可全部显示  以下是代码 scale(){varchartDom=document.getElementById("twenty");varmyChart=this.$echarts.init(chartDom);......
  • React Native Expo 热更新
    以前都是expopublish推送到我的expo进行调试的,今天在vscode的那个页面输入这个命令,竟然发现我手机上打包的app竟然热更新了?!!!我没有下载apk,安装啥的,里面的内容竟然热更新了?!!!,厉害啊,我滴哥,expo太强了 ......
  • requests代理设置
    和urllib一样,多的介绍就不说了,直接上代码:importrequestsproxies={"http":"http://user:[email protected]:80","https":"http://10.10.1.10:1080",}requests.get("https://www.geekdigging.com/",proxies=proxies)......
  • ReactiveUI使用笔记,教程总结
    ReactiveUI使用笔记,教程总结一、LINQ和RxLINQ(LanguageIntergratedQuery)对数据集合、关系数据、XML文件等对象进行查询和提取数据的技术,提供了统一的类似SQL的语法来对数据进行查询,而不用关心数据源的不同。二、Rx(ReactiveExtensions)对LING的一种扩展,提供了一种新的组织和......
  • TypeScript学习笔记-尚硅谷TypeScript教程(李立超老师TS新课)
    TypeScript学习笔记-尚硅谷TypeScript教程(李立超老师TS新课)https://blog.csdn.net/m0_46549017/article/details/124626987?ops_request_misc=&request_id=&biz_id=&utm_medium=distribute.pc_search_result.none-task-blog-2~all~koosearch~default-2-124626987-null-null.142^......
  • requests如何不使用系统代理
    1.指定域名不使用代理importosimportrequestsos.environ['NO_PROXY']='stackoverflow.com'response=requests.get('http://www.stackoverflow.com')2.设置代理为Noneimportrequestsproxies={"http":None,"......
  • React 组件进入和退出动画实现
    在实现一个React中的弹框组件时,想给组件加个进入和退出动画,但发现React没有Vue3那样现成的api,因此需要自己设计。主要思路为给组件添加一个state来选择className,不同的className会给组件添加不同的动画效果,再使用cssanimation中的forwards来使组件固定在结束的位置。核心代码如......