表格组件
一个灵活的表格组件,支持多种变体和样式,用于展示结构化数据。
安装
npx
npx hb-design-cli add table
预览
默认表格
| 姓名 | 年龄 | 职位 | 入职日期 |
| 张三 | 28 | 前端开发工程师 | 2022-05-15 |
| 李四 | 32 | 产品经理 | 2021-08-23 |
| 王五 | 45 | 技术总监 | 2019-11-10 |
| 赵六 | 35 | UI设计师 | 2023-01-05 |
默认表格
带边框表格
| 产品名称 | 价格 | 库存 | 销量 |
| 智能手表 | 1299 | 156 | 328 |
| 无线耳机 | 899 | 245 | 567 |
| 平板电脑 | 2999 | 89 | 124 |
| 智能手机 | 5999 | 124 | 432 |
带边框表格
自定义表格
| 图片 | 图片内容 |
| vercel | |
| next.js | |
| flie |
自定义表格
你可以对表格进行自由的修改,包括图片、视频、文本等,条件就是他可以被div所包裹,你可以自由书写jsx语法,理论上可以使用表格去写页面布局,但是我并不推荐你去这么做。
组件源码
Table 组件源码
import React, { forwardRef } from 'react';
export interface TableProps extends React.HTMLAttributes<HTMLDivElement> {
className?: string;
variant?: 'default' | 'bordered' | 'striped';
}
export interface TableBodyProps extends React.HTMLAttributes<HTMLDivElement> {
Item: (number|string|React.ReactNode)[][]|HTMLDivElement[];
className?: string;
}
export const Table = forwardRef<HTMLDivElement, TableProps>(
({ className, variant = 'default', children, ...props }, ref) => {
const baseClasses = "w-full overflow-hidden";
const variantClasses = {
default: "",
bordered: "border border-gray-200 dark:border-gray-800 rounded-lg",
striped: ""
};
const classes = [
baseClasses,
variantClasses[variant],
className
].filter(Boolean).join(' ');
return (
<div
ref={ref}
className={classes}
data-table="root"
{...props}
>
{children}
</div>
);
}
);
Table.displayName = 'Table';
export const TableBody = forwardRef<HTMLDivElement, TableBodyProps>(
({ className, Item, ...props }, ref) => {
const classes = [
"w-full",
className
].filter(Boolean).join(' ');
const formatItems = () => {
if (!Array.isArray(Item)) {
return [];
}
if (Array.isArray(Item[0])) {
return Item;
}
return [[...(Item as unknown as (number|string)[])]];
};
const formattedItems = formatItems();
return (
<div ref={ref} className={classes} data-table="body" {...props}>
<table className="w-full">
<tbody>
{formattedItems.map((row, rowIndex) => (
<tr
key={rowIndex}
className="border-b border-gray-200 dark:border-gray-800 hover:bg-gray-50 dark:hover:bg-gray-900/50 transition-colors"
>
{Array.isArray(row) ? row.map((cell, cellIndex) => (
<td
key={cellIndex}
className="py-3 px-4 text-gray-700 dark:text-gray-300"
>
{cell}
</td>
)):''}
</tr>
))}
</tbody>
</table>
</div>
);
}
);
TableBody.displayName = 'TableBody';属性说明
| 属性名 | 类型 | 默认值 | 说明 |
| variant | 'default' | 'bordered' | 'striped' | 'default' | 表格样式变体 |
| className | string | 自定义类名 | |
| children | React.ReactNode | 表格子元素 |
TableBody 属性说明
| 属性名 | 类型 | 默认值 | 说明 |
| Item | (number|string)[][] | 表格数据 | |
| className | string | 自定义类名 |