haob-design

表格组件

一个灵活的表格组件,支持多种变体和样式,用于展示结构化数据。

安装

npx
npx hb-design-cli add table

预览

默认表格

姓名年龄职位入职日期
张三28前端开发工程师2022-05-15
李四32产品经理2021-08-23
王五45技术总监2019-11-10
赵六35UI设计师2023-01-05
默认表格

带边框表格

产品名称价格库存销量
智能手表1299156328
无线耳机899245567
平板电脑299989124
智能手机5999124432
带边框表格

自定义表格

图片图片内容
table
vercel
table
next.js
table
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'表格样式变体
classNamestring自定义类名
childrenReact.ReactNode表格子元素

TableBody 属性说明

属性名类型默认值说明
Item(number|string)[][]表格数据
classNamestring自定义类名