首页 > 其他分享 >【React工作记录七十八】React+hook+ts+ant design封装一个table的组件

【React工作记录七十八】React+hook+ts+ant design封装一个table的组件

时间:2023-05-31 22:02:40浏览次数:38  
标签:ant const 歌谣 title number React hook props page

前言

我是歌谣 我有个兄弟 巅峰的时候排名c站总榜19 叫前端小歌谣 曾经我花了三年的时间创作了他 现在我要用五年的时间超越他 今天又是接近兄弟的一天人生难免坎坷 大不了从头再来 歌谣的意志是永恒的 放弃很容易 但是坚持一定很酷 微信公众号前端小歌谣

需求分析

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

功能思维

【React工作记录七十八】React+hook+ts+ant design封装一个table的组件_Data

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

<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: {},
    });

总结

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

标签:ant,const,歌谣,title,number,React,hook,props,page
From: https://blog.51cto.com/u_14476028/6390235

相关文章

  • 新型探索:React Native与小程序容器技术的结合
    ReactNative是由Facebook开发并于2015年首次发布的一个框架,用于构建原始的移动应用程序。它具有许多技术上的优势:跨平台开发:使用ReactNative,您可以使用相同的代码库构建同时运行在iOS和Android平台上的应用程序。这种跨平台的开发方式可以大大减少开发工作量和时间成本,因为您不需......
  • React Native+小程序容器=更高的开发效率
    ReactNative是由Facebook开发并于2015年首次发布的一个框架,用于构建原始的移动应用程序。它具有许多技术上的优势:跨平台开发:使用ReactNative,您可以使用相同的代码库构建同时运行在iOS和Android平台上的应用程序。这种跨平台的开发方式可以大大减少开发工作量和时间成本,因为......
  • 基于Jmeter+ant+Jenkins+钉钉机器人群通知的接口自动化测试
    博主写的非常好https://www.cnblogs.com/tdp0108/p/17446834.html#top前言   搭建jmeter+ant+jenkins环境有些前提条件,那就是要先配置好java环境,本地java环境至少是JDK8及以上版本,最好是JAVA11或者JAVA17等较高的java环境,像jenkins这种持续构建工具基本都在向上兼容JAVA的......
  • 基于Jmeter+ant+Jenkins+钉钉机器人群通知的接口自动化测试
     前言   搭建jmeter+ant+jenkins环境有些前提条件,那就是要先配置好java环境,本地java环境至少是JDK8及以上版本,最好是JAVA11或者JAVA17等较高的java环境,像jenkins这种持续构建工具基本都在向上兼容JAVA的环境,以前的JAVA8或者以下版本可能在运行jenkins等时可能会有异常导致......
  • JavaScript中的Hook技术:特性、优点、缺点和使用场景
    引言:随着JavaScript的不断发展,开发者们正在寻找更灵活和可扩展的方式来修改或扩展现有的代码。其中一种广泛应用的技术是"Hook",它允许开发者拦截和修改现有的函数或方法的行为。本文将详细介绍JavaScript中的Hook技术,包括其特性、优点、缺点和使用场景,并提供示例代码进行说明。什么......
  • JDK 8 新时间Instant
        ......
  • 前端 React + vite + Typescript 后端 java + springmvc + jwt 跨域 解决方案
    首先后端配置跨域:web.xml文件: <!--配置跨域--><filter><filter-name>header</filter-name><filter-class>org.zhiyi.config.Cross</filter-class></filter><filter-mapping><......
  • SimpleAdmin手摸手教学之:基于Ant Design Tree组件实现树形结构数据的异步加载
    一、说明当有一个树形结构的数据有非常多个节点的时候,一次性加载所有节点会显得过于臃肿,可能会对性能造成影响,正好AntDesign的树(Tree)组件支持异步加载,于是我就想把异步加载封装为一个组件,可以减少接口数据返回,点击展开节点,动态加载数据。非常好用!二、前端实现需要接收一些......
  • 从ReentrantLock角度解剖AQS----未完成,持续更新中。。
    具体如何流转,何时进入队列,状态何时变化,何时被唤醒等流程待更新中。。。AQS重要属性publicabstractclassAbstractQueuedSynchronizerextendsAbstractOwnableSynchronizerimplementsjava.io.Serializable{ //内部类node staticfinalclassNode{ //等待状......
  • 跨平台开发的优势:ReactNative与小程序容器
    ​结合ReactNative和小程序容器技术,开发者可以通过热重载和快速迭代提高开发效率,并实现统一的代码和逻辑,简化维护和升级过程。这种技术应用价值使得开发者能够更灵活地构建跨平台应用程序,并充分利用多个生态系统的优势。ReactNative与小程序容器技术的结合为移动应用开发提供......