avatar
UI
Components
Changelog
LobeHub UI
Antd Components
Lucide Icons
CSSinJS
Ctrl
K
Chat
ChatInputArea
ChatItem
EditableMessage
Data Display
Card
ChatMarkdown
CollapseGroup
Descriptions
Highlighter
JsonViewer
LogViewer
ProCard
RichTextEditor
Status
Table
Tree
Data Entry
CodeEditor
Form
Mentions
MonacoEditor
SelectCard
SliderInput
Feedback
Alert
DragPanel
Drawer
Modal
Notification
General
Breadcrumb
Typography
WaveformIcon
Layout
Divider
Page
Navigation
ButtonGroup
Dropdown
Theme
ConfigProvider
Logo
TTS
useSpeechSynthes
Utils
FormHelper

Table

A table displays rows of data.

import { Table } from '@yuntijs/ui';
NPM
UNPKG
BundlePhobia
PackagePhobia
Anvaka Graph
Source
Edit
Previous
Status
Next
Tree

Resources

Lobe UI-AIGC Components
Lobe Icon-AI / LLM Icon Collection
Lobe Charts-Modern Charts
Lobe TTS-TTS / STT Library

Community

Report Bug
Request Feature

Help

GitHub
Changelog

More Products

🤯 Lobe Chat-AI / LLM Chat Framework
🧸 Lobe Vidol-Virtual Idols for EveryOne
🅰️ Lobe Theme-Stable Diffusion Extension
🌐 Lobe i18n-AI i18next CLI
Copyright © 2022-2026
Made with ☁️ by YuntiJS
LobeHub

Usage

based on antd Table component, add a CollapseTable component.

Simple usage

TSX
import { Space, Table, Tag } from 'antd';
import type { TableProps } from 'antd';
import React from 'react';

interface DataType {
  key: string;
  name: string;
  age: number;
  address: string;
  tags: string[];
}

const columns: TableProps<DataType>['columns'] = [
  {
    title: 'Name',
    dataIndex: 'name',
    key: 'name',
    render: text => <a>{text}</a>,
  },
  {
    title: 'Age',
    dataIndex: 'age',
    key: 'age',
  },
  {
    title: 'Address',
    dataIndex: 'address',
    key: 'address',
  },
  {
    title: 'Tags',
    key: 'tags',
    dataIndex: 'tags',
    render: (_, { tags }) => (
      <>
        {tags.map(tag => {
          let color = tag.length > 5 ? 'geekblue' : 'green';
          if (tag === 'loser') {
            color = 'volcano';
          }
          return (
            <Tag color={color} key={tag}>
              {tag.toUpperCase()}
            </Tag>
          );
        })}
      </>
    ),
  },
  {
    title: 'Action',
    key: 'action',
    render: (_, record) => (
      <Space size="middle">
        <a>Invite {record.name}</a>
        <a>Delete</a>
      </Space>
    ),
  },
];

const data: DataType[] = [
  {
    key: '1',
    name: 'John Brown',
    age: 32,
    address: 'New York No. 1 Lake Park',
    tags: ['nice', 'developer'],
  },
  {
    key: '2',
    name: 'Jim Green',
    age: 42,
    address: 'London No. 1 Lake Park',
    tags: ['loser'],
  },
  {
    key: '3',
    name: 'Joe Black',
    age: 32,
    address: 'Sydney No. 1 Lake Park',
    tags: ['cool', 'teacher'],
  },
];

const App: React.FC = () => <Table columns={columns} dataSource={data} />;

export default App;

CollapseTable

Playground

APIs

NameDescriptionTypeDefault
dropdownPrefixCls--string--
dataSource--{length:number;toString:()=>string;toLocaleString:()=>string;concat:(items:ConcatArray<T>[])=>T[]|(items:(T | ConcatArray<T>)[])=>T[];join:(separator?:string)=>string;slice:(start?:number,end?:number)=>T[];indexOf:(searchElement:T,fromIndex?:number)=>number;lastIndexOf:(searchElement:T,fromIndex?:number)=>number;every:(predicate:(value: T, index: number, array: readonly T[]) => value is S,thisArg?:any)=>boolean|(predicate:(value: T, index: number, array: readonly T[]) => unknown,thisArg?:any)=>boolean;some:(predicate:(value: T, index: number, array: readonly T[]) => unknown,thisArg?:any)=>boolean;forEach:(callbackfn:(value: T, index: number, array: readonly T[]) => void,thisArg?:any)=>void;map:(callbackfn:(value: T, index: number, array: readonly T[]) => U,thisArg?:any)=>U[];filter:(predicate:(value: T, index: number, array: readonly T[]) => value is S,thisArg?:any)=>S[]|(predicate:(value: T, index: number, array: readonly T[]) => unknown,thisArg?:any)=>T[];reduce:(callbackfn:(previousValue: T, currentValue: T, currentIndex: number, array: readonly T[]) => T)=>any|(callbackfn:(previousValue: T, currentValue: T, currentIndex: number, array: readonly T[]) => T,initialValue:T)=>any|(callbackfn:(previousValue: U, currentValue: T, currentIndex: number, array: readonly T[]) => U,initialValue:U)=>any;reduceRight:(callbackfn:(previousValue: T, currentValue: T, currentIndex: number, array: readonly T[]) => T)=>any|(callbackfn:(previousValue: T, currentValue: T, currentIndex: number, array: readonly T[]) => T,initialValue:T)=>any|(callbackfn:(previousValue: U, currentValue: T, currentIndex: number, array: readonly T[]) => U,initialValue:U)=>any;find:(predicate:(this: void, value: T, index: number, obj: readonly T[]) => value is S,thisArg?:any)=>any|(predicate:(value: T, index: number, obj: readonly T[]) => unknown,thisArg?:any)=>any;findIndex:(predicate:(value: T, index: number, obj: readonly T[]) => unknown,thisArg?:any)=>number;entries:unknown;keys:unknown;values:()=>unknown;includes:(searchElement:T,fromIndex?:number)=>boolean;flatMap:(callback:(this: This, value: T, index: number, array: T[]) => U | readonly U[],thisArg?:This)=>U[];flat:(depth?:D)=>FlatArray<A_D>[];__@iterator@1032:()=>unknown}--
columns--ColumnGroupType<RecordType>|ColumnType<RecordType>[]--
pagination--|TablePaginationConfig--
loading--boolean|SpinProps--
size--"small"|"middle"|"large"--
bordered--boolean--
locale--{filterTitle?:string;filterConfirm?:ReactNode;filterReset?:ReactNode;filterEmptyText?:ReactNode;filterCheckall?:ReactNode;filterCheckAll?:ReactNode;filterSearchPlaceholder?:string;emptyText?:ReactNode|()=>|string|number|unknown|ReactElement|unknown|ReactPortal|Promise<AwaitedReactNode>|boolean;selectAll?:ReactNode;selectNone?:ReactNode;selectInvert?:ReactNode;selectionAll?:ReactNode;sortTitle?:string;expand?:string;collapse?:string;triggerDesc?:string;triggerAsc?:string;cancelSort?:string}--
rootClassName--string--
onChange--(pagination:import("/node_modules/antd/es/table/interface").TablePaginationConfig,filters:Record<string, import("/node_modules/antd/es/table/interface").FilterValue | null>,sorter:import("/node_modules/antd/es/table/interface").SorterResult<RecordType> | import("/node_modules/antd/es/table/interface").SorterResult<RecordType>[],extra:import("/node_modules/antd/es/table/interface").TableCurrentDataSource<RecordType>)=>void--
rowSelection--{preserveSelectedRowKeys?:boolean;type?:"checkbox"|"radio";selectedRowKeys?:Key[];defaultSelectedRowKeys?:Key[];onChange?:(selectedRowKeys:React.Key[],selectedRows:T[],info:{ type: import("/node_modules/antd/es/table/interface").RowSelectMethod; })=>void;getCheckboxProps?:(record:T)=>{children?:ReactNode;style?:object;onChange?:(e:T)=>void;prefixCls?:string;className?:string;rootClassName?:string;autoFocus?:boolean;value?:any;onFocus?:(event:E)=>void;onBlur?:(event:E)=>void;id?:string;disabled?:boolean;type?:string;tabIndex?:number;title?:string;onKeyDown?:(event:E)=>void;onKeyPress?:(event:E)=>void;onClick?:(event:E)=>void;onMouseEnter?:(event:E)=>void;onMouseLeave?:(event:E)=>void;name?:string;required?:boolean;indeterminate?:boolean;skipGroup?:boolean};onSelect?:(record:T,selected:boolean,selectedRows:T[],nativeEvent:Event)=>void;onSelectMultiple?:(selected:boolean,selectedRows:T[],changeRows:T[])=>void;onSelectAll?:(selected:boolean,selectedRows:T[],changeRows:T[])=>void;onSelectInvert?:(selectedRowKeys:React.Key[])=>void;onSelectNone?:()=>void;selections?:Array<INTERNAL_SELECTION_ITEM>|boolean;hideSelectAll?:boolean;fixed?:left|right|boolean;columnWidth?:string|number;columnTitle?:ReactNode|(checkboxNode:React.ReactNode)=>|string|number|unknown|ReactElement|unknown|ReactPortal|Promise<AwaitedReactNode>|boolean;checkStrictly?:boolean;align?:"left"|"right"|"center";renderCell?:(value:boolean,record:T,index:number,originNode:React.ReactNode)=>|string|number|unknown|ReactElement|unknown|ReactPortal|Promise<AwaitedReactNode>|RenderedCell<T>|boolean;onCell?:(data:DataType,index?:number)=>unknown;getTitleCheckboxProps?:()=>unknown}--
getPopupContainer--(triggerNode:HTMLElement)=>HTMLElement--
scroll--{x?:number||string;y?:number|string;scrollToFirstRowOnChange?:boolean}--
sortDirections--SortOrder[]--
showSorterTooltip--boolean|SorterTooltipProps--
virtual--boolean--
children--ReactNode--
style--{}--
prefixCls--string--
className--string--
direction--"ltr"|"rtl"--
id--string--
title--(data:readonly RecordType[])=>|string|number|unknown|ReactElement|unknown|ReactPortal|Promise<AwaitedReactNode>|boolean--
onScroll--(event:E)=>void--
expandIcon--(props:import("/node_modules/rc-table/lib/interface").RenderExpandIconProps<RecordType>)=>|string|number|unknown|ReactElement|unknown|ReactPortal|Promise<AwaitedReactNode>|boolean--
components--{table?:string|number|unknown|unknown|FunctionComponent|FC|ForwardRefExoticComponent;header?:object;body?:CustomizeScrollBody<RecordType>|{wrapper?:string|number|unknown|unknown|FunctionComponent|FC|ForwardRefExoticComponent;row?:string|number|unknown|unknown|FunctionComponent|FC|ForwardRefExoticComponent;cell?:string|number|unknown|unknown|FunctionComponent|FC|ForwardRefExoticComponent}}--
footer--(data:readonly RecordType[])=>|string|number|unknown|ReactElement|unknown|ReactPortal|Promise<AwaitedReactNode>|boolean--
summary--(data:readonly RecordType[])=>|string|number|unknown|ReactElement|unknown|ReactPortal|Promise<AwaitedReactNode>|boolean--
caption--ReactNode--
expandedRowKeys--Key[]--
defaultExpandedRowKeys--Key[]--
expandedRowRender--(record:ValueType,index:number,indent:number,expanded:boolean)=>|string|number|unknown|ReactElement|unknown|ReactPortal|Promise<AwaitedReactNode>|boolean--
expandRowByClick--boolean--
onExpand--(expanded:boolean,record:RecordType)=>void--
onExpandedRowsChange--(expandedKeys:React.Key[])=>void--
defaultExpandAllRows--boolean--
indentSize--number--
expandIconColumnIndex--number--
expandedRowClassName--(record:RecordType,index:number,indent:number)=>string--
childrenColumnName--string--
rowKey--string|unknown|GetRowKey<RecordType>--
tableLayout--"auto"|"fixed"--
expandableConfig expand rows{expandedRowKeys?:object;defaultExpandedRowKeys?:object;expandedRowRender?:(record:ValueType,index:number,indent:number,expanded:boolean)=>|string|number|unknown|ReactElement|unknown|ReactPortal|Promise<AwaitedReactNode>|boolean;columnTitle?:ReactNode;expandRowByClick?:boolean;expandIcon?:(props:import("/node_modules/rc-table/lib/interface").RenderExpandIconProps<RecordType>)=>|string|number|unknown|ReactElement|unknown|ReactPortal|Promise<AwaitedReactNode>|boolean;onExpand?:(expanded:boolean,record:RecordType)=>void;onExpandedRowsChange?:(expandedKeys:readonly React.Key[])=>void;defaultExpandAllRows?:boolean;indentSize?:number;expandIconColumnIndex?:number;showExpandColumn?:boolean;expandedRowClassName?:string|RowClassName<RecordType>;childrenColumnName?:string;rowExpandable?:(record:RecordType)=>boolean;columnWidth?:number|string;fixed?:left|right|boolean;expandedRowOffset?:number}--
rowClassName--string|RowClassName<RecordType>--
showHeader--boolean--
onRow--unknown--
onHeaderRow--(data:DataType,index?:number)=>unknown--
sticky--boolean|TableSticky--
rowHoverable--boolean--
tailor--boolean--
getContainerWidth--(ele:HTMLElement,width:number)=>number--
Name
Age
Tags
Action
The YuntiUI components are inspired by LobeUI and developed based on Antd components, fully compatible with Antd components, and it is recommended to use antd-style as the default css-in-js styling solution.32NICEDEVELOPER
Jim Green42LOSER
Not Expandable29COOLTEACHER
Joe Black32COOLTEACHER
  • 共计 4 条
  • 1
输出变量
变量名变量类型描述
answerstring
answer
大模型生成的回答
fileblob
file
大模型生成的文件
Name
Age
Tags
Action
The YuntiUI components are inspired by LobeUI and developed based on Antd components, fully compatible with Antd components, and it is recommended to use antd-style as the default css-in-js styling solution.32NICEDEVELOPER
Jim Green42LOSER
Not Expandable29COOLTEACHER
Joe Black32COOLTEACHER
  • 共计 4 条
  • 1