TinyBase logoTinyBase β

<SliceInHtmlTable />

In this demo, we showcase the SliceInHtmlTable component, a way to display the Slice portions of an Index.

Rather than building the whole demo and boilerplate from scratch, we're going back and making changes to the <TableInHtmlTable /> demo to demonstrate this new component. Basically, where we previously displayed a Table from a Store, we are now creating an Index and displaying one of its Slice objects.

Set Up

We switch out the TableInHtmlTable component and import the SliceInHtmlTable component instead. We'll also need the createIndexes function and useCreateIndexes hook:

-const {createStore} = TinyBase;
+const {createIndexes, createStore} = TinyBase;
-const {Provider, useCell, useCreateStore} = TinyBaseUiReact;
+const {Provider, useCell, useCreateIndexes, useCreateStore} = TinyBaseUiReact;
-const {TableInHtmlTable} = TinyBaseUiReactDom;
+const {SliceInHtmlTable} = TinyBaseUiReactDom;

We need to define the Index we are going to use. In the main App component, we can create the memoized Indexes object, and index the genres by the length of their name.

 const store = useCreateStore(createStore);
+const indexes = useCreateIndexes(store, (store) =>
+  createIndexes(store).setIndexDefinition(
+    'genresByNameLength',
+    'genres',
+    (getCell) => 'length ' + getCell('name').length,
+  ),
+);

...and expose it into the app-wide context:

   return (
-    <Provider store={store}>{isLoading ? <Loading /> : <Body />}</Provider>
+    <Provider store={store} indexes={indexes}>
+      {isLoading ? <Loading /> : <Body />}
+    </Provider>
   );

Using the SliceInHtmlTable Component

The SliceInHtmlTable component is very similar to the TableInHtmlTable component, but instead of taking a tableId, we provide it with the indexId and the sliceId we want to display (here, the names that are 6 letters long):

 const Body = () => {
   return (
-    <>
-      <TableInHtmlTable tableId='genres' />
-      <TableInHtmlTable tableId='genres' headerRow={false} idColumn={false} />
-      <TableInHtmlTable tableId='genres' customCells={customCells} />
-    </>
+    <SliceInHtmlTable indexId='genresByNameLength' sliceId='length 6' />
   );
 };

For fun we could add the 'editable' prop to this table, but of course as soon as you add to or delete from the name of the genre, it will get reindexed into a different Slice and disappear! So maybe not.

Take a look at the SliceInHtmlTableProps type and HtmlTableProps type to see all the ways in which you can configure this component, and again, click the 'CodePen' link under the demo above to try them out.

As well as displaying a Slice from an Indexes object, you can also render the links between Tables with a Relationships object, as you'll see next up in the <RelationshipInHtmlTable /> demo.