useHasCellListener
The useHasCellListener
hook registers a listener function with the Store
that will be called when a Cell
is added to or removed from the Store
.
useHasCellListener(
tableId: IdOrNull,
rowId: IdOrNull,
cellId: IdOrNull,
listener: HasCellListener,
listenerDeps?: DependencyList,
mutator?: boolean,
storeOrStoreId?: StoreOrStoreId,
): void
Type | Description | |
---|---|---|
tableId | IdOrNull | |
rowId | IdOrNull | |
cellId | IdOrNull | |
listener | HasCellListener | The function that will be called whenever the matching |
listenerDeps? | DependencyList | An optional array of dependencies for the |
mutator? | boolean | An optional boolean that indicates that the listener mutates |
storeOrStoreId? | StoreOrStoreId | The |
returns | void | This has no return value. |
This hook is useful for situations where a component needs to register its own specific listener to do more than simply tracking the value (which is more easily done with the useHasCell
hook).
You can either listen to a single Cell
being added or removed (by specifying the Table
Id
, Row
Id
, and Cell
Id
as the method's first three parameters) or changes to any Cell
(by providing null
wildcards).
All, some, or none of the tableId
, rowId
, and cellId
parameters can be wildcarded with null
. You can listen to a specific Cell
in a specific Row
in a specific Table
, any Cell
in any Row
in any Table
, for example - or every other combination of wildcards.
Unlike the addHasCellListener
method, which returns a listener Id
and requires you to remove it manually, the useHasCellListener
hook manages this lifecycle for you: when the listener changes (per its listenerDeps
dependencies) or the component unmounts, the listener on the underlying Store
will be deleted.
Example
This example uses the useHasCellListener
hook to create a listener that is scoped to a single component. When the component is unmounted, the listener is removed from the Store
.
import {Provider, useHasCellListener} from 'tinybase/ui-react';
import React from 'react';
import {createRoot} from 'react-dom/client';
import {createStore} from 'tinybase';
const App = ({store}) => (
<Provider store={store}>
<Pane />
</Provider>
);
const Pane = () => {
useHasCellListener('pets', 'fido', 'color', () =>
console.log('Cell existence changed'),
);
return <span>App</span>;
};
const store = createStore();
const app = document.createElement('div');
const root = createRoot(app);
root.render(<App store={store} />);
console.log(store.getListenerStats().hasCell);
// -> 1
store.setCell('pets', 'fido', 'color', 'brown');
// -> 'Cell existence changed'
root.unmount();
console.log(store.getListenerStats().hasCell);
// -> 0
Since
v4.4.0