{value}
react-headless-table
A react table that's easy to use, easy to customize.
Inspired by react-table but with Typescript support built in and a simpler API. Forked from react-final-table
Features
- Type safe
- ~Global row filtering~
- Row selection~
- Custom column rendering
- Column sorting
- Data memoization for performance
- Zero dependencies
Table of Contents
Motivation
Yes, another table component. This is inspired by react-table
but v7 seems
to be all over the place with a crazy api that just doesn't look good. It's
also lacking native typescript support and is just a big turn off. I also needed
an easier to use controlled component for server side table rendering but still
kept track of state so that I wouldn't have to maintain state outside of the table.
Install
npm install react-headless-table
Demos
useTable
This is the main hook exposed by the library and should be your entrypoint for
any table functionality. Only columns
and rows
are required as arguments:
const headers rows = ;
columns
: The first argument is an array of columns of type ColumnType. Only the name of each column is required. Each column has the following type signature:
;
rows
: Rows is the second argument to useTable and can be an array of any object type.
Examples
Basic example
; ; ; ;
Searching
const Table: FC = const headers rows setSearchString = ; return <> <input ="text" = ></input> <table> <thead> <tr> headers </tr> </thead> <tbody> rows </tbody> </table> </> ;
Row Selection
import React useMemo from 'react';import useTable from 'react-final-table';import makeData from 'makeData'; // replace this with your own data { const columns rows = ; const headers rows selectRow selectedRows = ; return <> <table> <thead> <tr> <th></th> headers </tr> </thead> <tbody> rows </tbody> </table> </> ;}
Pagination
const App: FC = const memoColumns = ; const memoData = ; const headers rows pagination = useTable< firstName: string; lastName: string; >memoColumns memoData pagination: true ; return <> <table> <thead> <tr> headers </tr> </thead> <tbody> rows </tbody> </table> <div> <button = = > '<' </button> <button = = > '>' </button> </div> </> ;
Performance
It's recommended that you memoize your columns and data using useMemo
. This is
to prevent the table from rerendering everytime your component rerenders, which
can have negative consequences on performance.
Contributing
Contributing is welcome. Please read the CONTRIBUTING doc for more.