Back to Ant Design

Table

components/table/index.en-US.md

6.3.723.0 KB
Original Source

When To Use

  • To display a collection of structured data.
  • To sort, search, paginate, filter data.

How To Use

Specify dataSource of Table as an array of data.

jsx
const dataSource = [
  {
    key: '1',
    name: 'Mike',
    age: 32,
    address: '10 Downing Street',
  },
  {
    key: '2',
    name: 'John',
    age: 42,
    address: '10 Downing Street',
  },
];

const columns = [
  {
    title: 'Name',
    dataIndex: 'name',
    key: 'name',
  },
  {
    title: 'Age',
    dataIndex: 'age',
    key: 'age',
  },
  {
    title: 'Address',
    dataIndex: 'address',
    key: 'address',
  },
];

<Table dataSource={dataSource} columns={columns} />;

Promotion

Examples

<!-- prettier-ignore -->

<code src="./demo/basic.tsx">Basic Usage</code> <code src="./demo/jsx.tsx">JSX style API</code> <code src="./demo/row-selection.tsx">selection</code> <code src="./demo/row-selection-and-operation.tsx">Selection and operation</code> <code src="./demo/row-selection-custom.tsx">Custom selection</code> <code src="./demo/row-selection-debug.tsx" debug>Selection Perf</code> <code src="./demo/head.tsx">Filter and sorter</code> <code src="./demo/filter-in-tree.tsx">Filter in Tree</code> <code src="./demo/filter-search.tsx">Filter search</code> <code src="./demo/multiple-sorter.tsx">Multiple sorter</code> <code src="./demo/reset-filter.tsx">Reset filters and sorters</code> <code src="./demo/custom-filter-panel.tsx">Customized filter panel</code> <code src="./demo/ajax.tsx">Ajax</code> <code src="./demo/size.tsx">size</code> <code src="./demo/narrow.tsx" debug>size</code> <code src="./demo/bordered.tsx">border, title and footer</code> <code src="./demo/expand.tsx">Expandable Row</code> <code src="./demo/expand-sticky.tsx" debug>Customizable expansion position</code> <code src="./demo/order-column.tsx">Order Specific Column</code> <code src="./demo/colspan-rowspan.tsx">colSpan and rowSpan</code> <code src="./demo/tree-data.tsx">Tree data</code> <code src="./demo/tree-table-ellipsis.tsx" debug>Tree data ellipsis debug demo</code> <code src="./demo/fixed-header.tsx">Fixed Header</code> <code src="./demo/fixed-columns.tsx">Fixed Columns</code> <code src="./demo/fixed-gapped-columns.tsx" version="5.14.0">Stack Fixed Columns</code> <code src="./demo/fixed-columns-header.tsx">Fixed Columns and Header</code> <code src="./demo/hidden-columns.tsx" version="5.13.0">Hidden Columns</code> <code src="./demo/grouping-columns.tsx">Grouping table head</code> <code src="./demo/edit-cell.tsx">Editable Cells</code> <code src="./demo/edit-row.tsx">Editable Rows</code> <code src="./demo/nested-table.tsx">Nested tables</code> <code src="./demo/drag-sorting.tsx">Drag sorting</code> <code src="./demo/drag-column-sorting.tsx">Drag Column sorting</code> <code src="./demo/drag-sorting-handler.tsx">Drag sorting with handler</code> <code src="./demo/ellipsis.tsx">ellipsis column</code> <code src="./demo/ellipsis-custom-tooltip.tsx">ellipsis column custom tooltip</code> <code src="./demo/custom-empty.tsx">Custom empty</code> <code src="./demo/summary.tsx">Summary</code> <code src="./demo/virtual-list.tsx" version="5.9.0">Virtual list</code> <code src="./demo/responsive.tsx">Responsive</code> <code src="./demo/nest-table-border-debug.tsx" debug>Nested Bordered Table Debug</code> <code src="./demo/pagination.tsx">Pagination Settings</code> <code src="./demo/row-selection-custom-debug.tsx" debug>Custom selection group</code> <code src="./demo/sticky.tsx">Fixed header and scroll bar with the page</code> <code src="./demo/dynamic-settings.tsx">Dynamic Settings</code> <code src="./demo/style-class.tsx" version="6.0.0">Custom semantic dom styling</code> <code src="./demo/selections-debug.tsx" debug>selections with icon</code> <code src="./demo/component-token.tsx" debug>Component Token</code> <code src="./demo/measure-row-render.tsx" debug>measureRowRender</code>

API

Common props ref:Common props

Table

PropertyDescriptionTypeDefaultVersion
borderedWhether to show all table bordersbooleanfalse
classNamesCustomize class for each semantic structure inside the component. Supports object or function.Record<SemanticDOM, string> | (info: { props })=> Record<SemanticDOM, string>-
columnsColumns of tableColumnsType[]-
componentsOverride default table elementsTableComponents-
dataSourceData record array to be displayedobject[]-
expandableConfig expandable contentexpandable-
footerTable footer rendererfunction(currentPageData)-
getPopupContainerThe render container of dropdowns in table(triggerNode) => HTMLElement() => TableHtmlElement
loadingLoading status of tableboolean | Spin Propsfalse
localeThe i18n text including filter, sort, empty text, etcobjectDefault Value
paginationConfig of pagination. You can ref table pagination config or full pagination document, hide it by setting it to falseobject | false-
rowClassNameRow's classNamefunction(record, index): string-
rowKeyRow's unique key, could be a string or function that returns a stringstring | function(record): stringkey
rowSelectionRow selection configobject-
rowHoverableRow hoverbooleantrue5.16.0
scrollWhether the table can be scrollable, configobject-
showHeaderWhether to show table headerbooleantrue
showSorterTooltipThe header show next sorter direction tooltip. It will be set as the property of Tooltip if its type is objectboolean | Tooltip props & {target?: 'full-header' | 'sorter-icon' }{ target: 'full-header' }5.16.0
sizeSize of tablelarge | medium | smalllarge
sortDirectionsSupported sort way, could be ascend, descendArray[ascend, descend]
stickySet sticky header and scroll barboolean | {offsetHeader?: number, offsetScroll?: number, getContainer?: () => HTMLElement}-4.6.0 (getContainer: 4.7.0)
stylesCustomize inline style for each semantic structure inside the component. Supports object or function.Record<SemanticDOM, CSSProperties> | (info: { props })=> Record<SemanticDOM, CSSProperties>-
summarySummary content(currentData) => ReactNode-
tableLayoutThe table-layout attribute of table element- | auto | fixed-<hr />fixed when header/columns are fixed, or using column.ellipsis
titleTable title rendererfunction(currentPageData)-
virtualSupport virtual listboolean-5.9.0
onChangeCallback executed when pagination, filters or sorter is changedfunction(pagination, filters, sorter, extra: { currentDataSource: [], action: paginate | sort | filter })-
onHeaderRowSet props on per header rowfunction(columns, index)-
onRowSet props on per rowfunction(record, index)-
onScrollTriggered when the table body is scrolled. Note that only vertical scrolling will trigger the event when virtualfunction(event)-5.16.0

Table ref

PropertyDescriptionTypeVersion
nativeElementThe wrap elementHTMLDivElement5.11.0
scrollToTrigger to scroll to target position. key match with record rowKey. When offset is specified, the table will scroll to align the target row to the top with the given offset and not working with top(config: { index?: number, key?: React.Key, top?: number, offset?: number }) => void5.11.0

onRow usage

Same as onRow onHeaderRow onCell onHeaderCell

jsx
<Table
  onRow={(record, rowIndex) => {
    return {
      onClick: (event) => {}, // click row
      onDoubleClick: (event) => {}, // double click row
      onContextMenu: (event) => {}, // right button click row
      onMouseEnter: (event) => {}, // mouse enter row
      onMouseLeave: (event) => {}, // mouse leave row
    };
  }}
  onHeaderRow={(columns, index) => {
    return {
      onClick: () => {}, // click header row
    };
  }}
/>

Column

One of the Table columns prop for describing the table's columns, Column has the same API.

PropertyDescriptionTypeDefaultVersion
alignThe specify which way that column is alignedleft | right | centerleft
classNameThe className of this columnstring-
colSpanSpan of this column's titlenumber-
dataIndexDisplay field of the data record, support nest path by string arraystring | string[]-
defaultFilteredValueDefault filtered valuesstring[]-
filterResetToDefaultFilteredValueclick the reset button, whether to restore the default filterbooleanfalse
defaultSortOrderDefault order of sorted valuesascend | descend-
ellipsisThe ellipsis cell content, not working with sorter and filters for now.
tableLayout would be fixed when ellipsis is true or { showTitle?: boolean }boolean | {showTitle?: boolean }falseshowTitle: 4.3.0
filterDropdownCustomized filter overlayReactNode | (props: FilterDropdownProps) => ReactNode-
filteredWhether the dataSource is filteredbooleanfalse
filteredValueControlled filtered value, filter icon will highlightstring[]-
filterIconCustomized filter iconReactNode | (filtered: boolean) => ReactNode-
filterOnCloseWhether to trigger filter when the filter menu closesbooleantrue5.15.0
filterMultipleWhether multiple filters can be selectedbooleantrue
filterModeTo specify the filter interface'menu' | 'tree''menu'4.17.0
filterSearchWhether to be searchable for filter menuboolean | function(input, record):booleanfalseboolean:4.17.0 function:4.19.0
filtersFilter menu configobject[]-
filterDropdownPropsCustomized dropdown props, filterDropdownOpen and onFilterDropdownOpenChange were available before <5.22.0DropdownProps-5.22.0
fixed(IE not support) Set column to be fixed: true(same as 'start') 'start' 'end'boolean | stringfalse
keyUnique key of this column, you can ignore this prop if you've set a unique dataIndexstring-
renderRenderer of the table cell. value is the value of current cell; record is the value object of current row; index is the row number. The return value should be a ReactNode(value: V, record: T, index: number): ReactNode-
responsiveThe list of breakpoints at which to display this column. Always visible if not setBreakpoint[]-4.2.0
rowScopeSet scope attribute for all cells in this columnrow | rowgroup-5.1.0
shouldCellUpdateControl cell render logic(record, prevRecord) => boolean-4.3.0
showSorterTooltipIf header show next sorter direction tooltip, override showSorterTooltip in tableboolean | Tooltip props & {target?: 'full-header' | 'sorter-icon' }{ target: 'full-header' }5.16.0
sortDirectionsSupported sort way, override sortDirections in Table, could be ascend, descendArray[ascend, descend]
sorterSort function for local sort, see Array.sort's compareFunction. If it is server-side sorting, set to true, but if you want to support multi-column sorting, you can set it to { multiple: number }function | boolean | { compare: function, multiple: number }-
sortOrderOrder of sorted values: ascend descend nullascend | descend | null-
sortIconCustomized sort icon(props: { sortOrder }) => ReactNode-5.6.0
titleTitle of this columnReactNode | ({ sortColumns, filters }) => ReactNode-
widthWidth of this column (width not working?)string | number-
minWidthMin width of this column, only works when tableLayout="auto"number-5.21.0
hiddenHidden this columnbooleanfalse5.13.0
onCellSet props on per cellfunction(record, rowIndex)-
onFilterFunction that determines if the row is displayed when filteredfunction(value, record) => boolean-
onHeaderCellSet props on per header cellfunction(column)-

ColumnGroup

PropertyDescriptionTypeDefault
titleTitle of the column groupReactNode-

pagination

Properties for pagination.

PropertyDescriptionTypeDefault
placementSpecify the placement of Pagination, could betopStart | topCenter | topEnd |bottomStart | bottomCenter | bottomEnd | noneArray[bottomEnd]
positionSpecify the position of Pagination, could betopLeft | topCenter | topRight |bottomLeft | bottomCenter | bottomRight | none, please use placement insteadArray[bottomRight]

More about pagination, please check Pagination.

expandable

Properties for expandable.

PropertyDescriptionTypeDefaultVersion
childrenColumnNameThe column contains children to displaystringchildren
columnTitleSet the title of the expand columnReactNode-4.23.0
columnWidthSet the width of the expand columnstring | number-
defaultExpandAllRowsExpand all rows initiallybooleanfalse
defaultExpandedRowKeysInitial expanded row keysstring[]-
expandedRowClassNameExpanded row's classNamestring | (record, index, indent) => string-string: 5.22.0
expandedRowKeysCurrent expanded row keysstring[]-
expandedRowRenderExpanded container render for each rowfunction(record, index, indent, expanded): ReactNode-
expandIconCustomize row expand Icon. Ref examplefunction(props): ReactNode-
expandRowByClickWhether to expand row by clicking anywhere in the whole rowbooleanfalse
fixedWhether the expansion icon is fixed. Optional true left rightboolean | stringfalse4.16.0
indentSizeIndent size in pixels of tree datanumber15
rowExpandableEnable row can be expandable(record) => boolean-
showExpandColumnShow expand columnbooleantrue4.18.0
onExpandCallback executed when the row expand icon is clickedfunction(expanded, record)-
onExpandedRowsChangeCallback executed when the expanded rows changefunction(expandedRows)-
expandedRowOffsetDeprecated: Expand the number of offset columns of the row. After setting, it will force the columns in front of it to be fixed columns. Please use'Table. EXPAND_COLUMN 'instead and control the position through column ordernumber-5.26.0

rowSelection

Properties for row selection.

PropertyDescriptionTypeDefaultVersion
alignSet the alignment of selection columnleft | right | centerleft5.25.0
checkStrictlyCheck table row precisely; parent row and children rows are not associatedbooleantrue4.4.0
columnTitleSet the title of the selection columnReactNode | (originalNode: ReactNode) => ReactNode-
columnWidthSet the width of the selection columnstring | number32px
fixedFixed selection column on the leftboolean-
getCheckboxPropsGet Checkbox or Radio propsfunction(record)-
getTitleCheckboxPropsGet title Checkbox propsfunction()-
hideSelectAllHide the selectAll checkbox and custom selectionbooleanfalse4.3.0
preserveSelectedRowKeysKeep selection key even when it removed from dataSourceboolean-4.4.0
renderCellRenderer of the table cell. Same as render in column(checked: boolean, record: T, index: number, originNode: ReactNode): ReactNode-4.1.0
selectedRowKeysControlled selected row keysstring[] | number[][]
selectionsCustom selection config, only displays default selections when set to trueobject[] | boolean-
typecheckbox or radiocheckbox | radiocheckbox
onCellSet props on per cell. Same as onCell in columnfunction(record, rowIndex)-5.5.0
onChangeCallback executed when selected rows changefunction(selectedRowKeys, selectedRows, info: { type })-info.type: 4.21.0
onSelectCallback executed when select/deselect one rowfunction(record, selected, selectedRows, nativeEvent)-

scroll

PropertyDescriptionTypeDefault
scrollToFirstRowOnChangeWhether to scroll to the top of the table when paging, sorting, filtering changesboolean-
xSet horizontal scrolling, can also be used to specify the width of the scroll area, could be number, percent value, true and 'max-content'string | number | true-
ySet vertical scrolling, can also be used to specify the height of the scroll area, could be string or numberstring | number-

selection

PropertyDescriptionTypeDefault
keyUnique key of this selectionstring-
textDisplay text of this selectionReactNode-
onSelectCallback executed when this selection is clickedfunction(changeableRowKeys)-

Using in TypeScript {#using-in-typescript}

tsx
import React from 'react';
import { Table } from 'antd';
import type { TableColumnsType } from 'antd';

interface User {
  key: number;
  name: string;
}

const columns: TableColumnsType<User> = [
  {
    key: 'name',
    title: 'Name',
    dataIndex: 'name',
  },
];

const data: User[] = [
  {
    key: 0,
    name: 'Jack',
  },
];

const Demo: React.FC = () => (
  <>
    <Table<User> columns={columns} dataSource={data} />
    <Table<User> dataSource={data}>
      <Table.Column<User> key="name" title="Name" dataIndex="name" />
    </Table>
  </>
);

export default Demo;

Here is the CodeSandbox for TypeScript.

Semantic DOM

<code src="./demo/_semantic.tsx" simplify="true"></code>

Design Token

<ComponentTokenTable component="Table"></ComponentTokenTable>

Note

According to the React documentation, every child in an array should be assigned a unique key. The values inside the Table's dataSource and columns should follow this rule. By default, dataSource[i].key will be treated as the key value for dataSource.

If dataSource[i].key is not provided, then you should specify the primary key of dataSource value via rowKey, as shown below. If not, warnings like the one above will show in browser console.

jsx
// primary key is uid
return <Table rowKey="uid" />;
// or
return <Table rowKey={(record) => record.uid} />;

FAQ

How to hide pagination when single page or no data? {#faq-hide-pagination}

You can set hideOnSinglePage with pagination prop.

Table will return to first page when filter data. {#faq-filter-to-first-page}

Table total page count usually reduce after filter data, we by default return to first page in case of current page is out of filtered results.

You may need to keep current page after filtering when fetch data from remote service, please check this demo as workaround.

Also you can use the action from extra param to determine when return to first page.

Why Table pagination show size changer? {#faq-size-changer}

In order to improve user experience, Pagination show size changer by default when total > 50 since 4.1.0. You can set showSizeChanger=false to disable this feature.

Why Table fully render when state change? {#faq-state-update-rerender}

Table can not tell what state used in columns.render, so it always need fully render to avoid sync issue. You can use column.shouldCellUpdate to control render.

How to handle fixed column display over the mask layout? {#faq-fixed-column-zindex}

Fixed column use z-index to make it over other columns. You will find sometimes fixed columns also over your mask layout. You can set z-index on your mask layout to resolve.

How to custom render Table Checkbox(For example, adding Tooltip)? {#faq-custom-checkbox-render}

Since 4.1.0, You can use rowSelection.renderCell to custom render Table Checkbox. If you want to add Tooltip, please refer to this demo.

Why does components.body.wrapper or components.body.row report an error when virtual is enabled? {#faq-virtual-wrapper-ref}

Because virtual table needs to get its ref to do some calculations, so you need to use React.forwardRef wrapper and pass the ref to the dom. Like this:

tsx
const EditableRow = React.forwardRef<HTMLTableRowElement, EditableRowProps>(
  ({ index, ...props }, ref) => {
    const [form] = Form.useForm();
    return (
      <Form form={form} component={false}>
        <EditableContext.Provider value={form}>
          <tr {...props} ref={ref} />
        </EditableContext.Provider>
      </Form>
    );
  },
);

For scenarios with fixed row heights and vertical scrolling, you can use the following method:

tsx
<Table
  //@ts-ignore // This property is not exported, but it can be passed through to the internal virtual scrolling
  listItemHeight={36} // This helps virtual scrolling calculate the height correctly, with each row fixed at 36px
/>