TableInHtmlTable
The TableInHtmlTable
component renders the contents of a single Table
in a Store
as an HTML <table> element, and registers a listener so that any changes to that result will cause a re-render.
TableInHtmlTable(props: TableInHtmlTableProps & HtmlTableProps): ComponentReturnType
Type | Description | |
---|---|---|
props | TableInHtmlTableProps & HtmlTableProps | The props for this component. |
returns | ComponentReturnType | A rendering of the |
See the <TableInHtmlTable /> demo for this component in action.
The component's props identify which Table
to render based on Table
Id
, and Store
(which is either the default context Store
, a named context Store
, or by explicit reference).
This component renders a Table
by iterating over its Row
objects. By default the Cells are in turn rendered with the CellView
component, but you can override this behavior by providing a component
for each Cell
in the customCells
prop. You can pass additional props to that custom component with the getComponentProps
callback. See the CustomCell
type for more details.
This component uses the useRowIds
hook under the covers, which means that any changes to the structure of the Table
will cause a re-render.
You can use the headerRow
and idColumn
props to control whether the Ids
appear in a <th> element at the top of the table, and the start of each row.
Examples
This example creates a Provider context into which a default Store
is provided. The TableInHtmlTable
component within it then renders the Table
in a <table> element with a CSS class.
import {Provider} from 'tinybase/ui-react';
import React from 'react';
import {TableInHtmlTable} from 'tinybase/ui-react-dom';
import {createRoot} from 'react-dom/client';
import {createStore} from 'tinybase';
const App = ({store}) => (
<Provider store={store}>
<Pane />
</Provider>
);
const Pane = () => <TableInHtmlTable tableId="pets" className="table" />;
const store = createStore().setTable('pets', {
fido: {species: 'dog'},
felix: {species: 'cat'},
});
const app = document.createElement('div');
createRoot(app).render(<App store={store} />);
console.log(app.innerHTML);
// ->
`
<table class="table">
<thead>
<tr>
<th>Id</th>
<th>species</th>
</tr>
</thead>
<tbody>
<tr>
<th>fido</th>
<td>dog</td>
</tr>
<tr>
<th>felix</th>
<td>cat</td>
</tr>
</tbody>
</table>
`;
This example creates a Provider context into which a default Store
is provided. The TableInHtmlTable
component within it then renders the Table
with a custom component and a custom props callback for the species
Cell
. The header row at the top of the table and the Id
column at the start of each row is removed.
import {CellView, Provider} from 'tinybase/ui-react';
import React from 'react';
import {TableInHtmlTable} from 'tinybase/ui-react-dom';
import {createRoot} from 'react-dom/client';
import {createStore} from 'tinybase';
const App = ({store}) => (
<Provider store={store}>
<Pane />
</Provider>
);
const Pane = () => (
<TableInHtmlTable
tableId="pets"
customCells={customCells}
headerRow={false}
idColumn={false}
/>
);
const FormattedCellView = ({tableId, rowId, cellId, bold}) => (
<>
{bold ? <b>{rowId}</b> : rowId}:
<CellView tableId={tableId} rowId={rowId} cellId={cellId} />
</>
);
const customCells = {
species: {
component: FormattedCellView,
getComponentProps: (rowId) => ({bold: rowId == 'fido'}),
},
};
const store = createStore().setTable('pets', {
fido: {species: 'dog'},
felix: {species: 'cat'},
});
const app = document.createElement('div');
createRoot(app).render(<App store={store} />);
console.log(app.innerHTML);
// ->
`
<table>
<tbody>
<tr>
<td><b>fido</b>:dog</td>
</tr>
<tr>
<td>felix:cat</td>
</tr>
</tbody>
</table>
`;
Since
v4.1.0