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

初始化版本(基础样式和分页)
| <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>) =>{ |
| |
| 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: {}, |
| }); |
总结
我是歌谣 放弃很容易 坚持一定很酷 关注前端小歌谣带你进入前端巅峰交流群
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南