Table Instance APIs
Internally, Material React Table uses the useReactTable
hook from TanStack Table to create a table instance that handles a majority of the logic and events and the state for the table.
You can access this table instance yourself by either setting up a tableInstanceRef
or by consuming a table
param from many of the callback functions in many of the props.
const tableInstanceRef = useRef(null);const someEventHandler = () => {tableInstanceRef.current. //call any of the table instance methods here};const columns = useMemo(() => [{accessor: 'name',header: 'Name',Cell: ({ cell, table }) => <span onClick={() => table.{/* or maybe here */}}></span>,},]);return (<MaterialReactTablecolumns={columns}data={data}//all callback props have access to the table instance when used like thisrenderTopToolbarCustomActions={({ table }) => (<Button onClick={() => table.{/* or maybe here */}}>Click Me</Button>)}tableInstanceRef={tableInstanceRef}/>);
NOTE: These are NOT the props for Material React Table. These are just static methods on a table instance that you can use.
Wanna see the source code for this table? Check it out down below!
1import React, { useEffect, useMemo, useState } from 'react';2import Link from 'next/link';3import {4 MaterialReactTable,5 type MRT_ColumnDef,6 type MRT_TableInstance,7} from 'material-react-table';8import { Link as MuiLink, Typography, useMediaQuery } from '@mui/material';9import { SampleCodeSnippet } from '../mdx/SampleCodeSnippet';10import { type TableInstanceAPI, tableInstanceAPIs } from './tableInstanceAPIs';1112interface Props {13 onlyProps?: Set<keyof MRT_TableInstance>;14}1516const TableInstanceAPIsTable = ({ onlyProps }: Props) => {17 const isDesktop = useMediaQuery('(min-width: 1200px)');1819 const columns = useMemo<MRT_ColumnDef<TableInstanceAPI>[]>(20 () => [21 {22 accessorKey: 'tableInstanceAPI',23 enableClickToCopy: true,24 header: 'State Option',25 muiTableBodyCellCopyButtonProps: ({ cell }) => ({26 className: 'table-instance-api',27 id: `${cell.getValue<string>()}-table-instance-api`,28 }),29 },30 {31 accessorKey: 'type',32 header: 'Type',33 enableGlobalFilter: false,34 Cell: ({ cell }) => (35 <SampleCodeSnippet36 className="language-ts"37 enableCopyButton={false}38 style={{39 backgroundColor: 'transparent',40 fontSize: '0.9rem',41 margin: 0,42 padding: 0,43 minHeight: 'unset',44 }}45 >46 {cell.getValue<string>()}47 </SampleCodeSnippet>48 ),49 },50 {51 accessorKey: 'link',52 disableFilters: true,53 enableGlobalFilter: false,54 header: 'More Info Links',55 Cell: ({ cell, row }) => (56 <Link href={cell.getValue<string>()} passHref legacyBehavior>57 <MuiLink58 target={59 cell.getValue<string>().startsWith('http')60 ? '_blank'61 : undefined62 }63 rel="noopener"64 >65 {row.original?.linkText}66 </MuiLink>67 </Link>68 ),69 },70 ],71 [],72 );7374 const [columnPinning, setColumnPinning] = useState({});7576 useEffect(() => {77 if (typeof window !== 'undefined') {78 if (isDesktop) {79 setColumnPinning({80 left: ['mrt-row-expand', 'mrt-row-numbers', 'tableInstanceAPI'],81 right: ['link'],82 });83 } else {84 setColumnPinning({});85 }86 }87 }, [isDesktop]);8889 const data = useMemo(() => {90 if (onlyProps) {91 return tableInstanceAPIs.filter(({ tableInstanceAPI }) =>92 onlyProps.has(tableInstanceAPI),93 );94 }95 return tableInstanceAPIs;96 }, [onlyProps]);9798 return (99 <MaterialReactTable100 columns={columns}101 data={data}102 displayColumnDefOptions={{103 'mrt-row-numbers': {104 size: 10,105 },106 'mrt-row-expand': {107 size: 10,108 },109 }}110 enableColumnActions={!onlyProps}111 enableColumnFilterModes112 enablePagination={false}113 enablePinning114 enableRowNumbers115 enableBottomToolbar={false}116 enableTopToolbar={!onlyProps}117 initialState={{118 columnVisibility: { description: false },119 density: 'compact',120 showGlobalFilter: true,121 sorting: [{ id: 'tableInstanceAPI', desc: false }],122 }}123 muiSearchTextFieldProps={{124 placeholder: 'Search Table APIs',125 sx: { minWidth: '18rem' },126 variant: 'outlined',127 }}128 muiTablePaperProps={{129 sx: { mb: '1.5rem' },130 id: onlyProps131 ? 'relevant-table-instance-apis-table'132 : 'table-instance-apis-table',133 }}134 positionGlobalFilter="left"135 renderDetailPanel={({ row }) => (136 <Typography137 color={row.original.description ? 'secondary.main' : 'text.secondary'}138 >139 {row.original.description || 'No Description Provided... Yet...'}140 </Typography>141 )}142 rowNumberMode="static"143 onColumnPinningChange={setColumnPinning}144 state={{ columnPinning }}145 />146 );147};148149export default TableInstanceAPIsTable;150