# Headers Guide ## API [Header API](../api/core/header) ## Headers Guide This quick guide will discuss the different ways you can retrieve and interact with `header` objects in TanStack Table. Headers are the equivalent of cells, but meant for the `` section of the table instead of the `` section. ### Where to Get Headers From Headers come from [Header Groups](./header-groups), which are the equivalent of rows, but meant for the `` section of the table instead of the `` section. #### HeaderGroup Headers If you are in a header group, the headers are stored as an array in the `headerGroup.headers` property. Usually you will just map over this array to render your headers. ```jsx {table.getHeaderGroups().map(headerGroup => { return ( {headerGroup.headers.map(header => ( // map over the headerGroup headers array {/* */} ))} ) })} ``` #### Header Table Instance APIs There are multiple `table` instance APIs that you can use to retrieve a list of headers depending on the features that you are using. The most common API you might use is `table.getFlatHeaders`, which will return a flat list of all headers in the table, but there are at least a dozen other headers that are useful in tandem with the column visibility and column pinning features. APIs like `table.getLeftLeafHeaders` or `table.getRightFlatHeaders` could be useful depending on your use case. ### Header Objects Header objects are similar to [Cell](./cells) objects, but meant for the `` section of the table instead of the `` section. Every header object can be associated with a `` or similar cell element in your UI. There are a few properties and methods on `header` objects that you can use to interact with the table state and extract cell values from the table based on the state of the table. #### Header IDs Every header object has an `id` property that makes it unique within the table instance. Usually you only need this `id` as a unique identifier for React keys or if you are following the [performant column resizing example](../framework/react/examples/column-resizing-performant). For simple headers with no advanced nested or grouped headers logic, the `header.id` will be the same as it's parent `column.id`. However, if the header is part group column or a placeholder cell, it will have a more complicated id that is constructed from the header family, depth/header row index, column id, and header group id. #### Nested Grouped Headers Properties There are a few properties on `header` objects that are only useful if the header is part of a nested or grouped header structure. These properties include: - `colspan`: The number of columns that the header should span. This is useful for rendering the `colSpan` attribute on the `` element. - `rowSpan`: The number of rows that the header should span. This is useful for rendering the `rowSpan` attribute on the `` element. (Currently not implemented in default TanStack Table) - `depth`: The header group "row index" that the header group belongs to. - `isPlaceholder`: A boolean flag that is true if the header is a placeholder header. Placeholder headers are used to fill in the gaps when a column is hidden or when a column is part of a group column. - `placeholderId`: The unique identifier for the placeholder header. - `subHeaders`: The array of sub/child headers that belong to this header. Will be empty if the header is a leaf header. > Note: `header.index` refers to its index within the header group (row of headers), i.e. its position from left to right. It is not the same as `header.depth`, which refers to the header group "row index". #### Header Parent Objects Every header stores a reference to its parent [column](./columns) object and its parent [header group](./header-groups) object. ### More Header APIs Headers have a few more useful APIs attached to them that are useful for interacting with the table state. Most of them relate to the Column sizing and resizing features. See the [Column Resizing Guide](./column-resizing) for more information. ### Header Rendering Since the `header` column option you defined can be either a string, jsx, or a function returning either of those, the best way to render the headers is to use the `flexRender` utility from your adapter, which will handle all of those cases for you. ```jsx {headerGroup.headers.map(header => ( {/* Handles all possible header column def scenarios for `header` */} {flexRender(header.column.columnDef.header, header.getContext())} ))}