useCreateMetrics
The useCreateMetrics
hook is used to create a Metrics
object within a React application with convenient memoization.
useCreateMetrics(
store: undefined | Store,
create: (store: Store) => Metrics,
createDeps?: DependencyList,
): Metrics | undefined
Type | Description | |
---|---|---|
store | undefined | Store | A reference to the |
create | (store: Store) => Metrics | A function for performing the creation steps of the |
createDeps? | DependencyList | An optional array of dependencies for the |
returns | Metrics | undefined | A reference to the |
It is possible to create a Metrics
object outside of the React app with the regular createMetrics
function and pass it in, but you may prefer to create it within the app, perhaps inside the top-level component. To prevent a new Metrics
object being created every time the app renders or re-renders, since v5.0 this hook performs the creation in an effect. As a result it will return undefined
on the brief first render (or if the Store
is not yet defined), which you should defend against.
If your create
function contains other dependencies, the changing of which should also cause the Metrics
object to be recreated, you can provide them in an array in the optional second parameter, just as you would for any React hook with dependencies.
This hook ensures the Metrics
object is destroyed whenever a new one is created or the component is unmounted.
Examples
This example creates a Metrics
object at the top level of a React application. Even though the App component is rendered twice, the Metrics
object creation only occurs once by default.
import {createMetrics, createStore} from 'tinybase';
import {useCreateMetrics, useCreateStore} from 'tinybase/ui-react';
import React from 'react';
import {createRoot} from 'react-dom/client';
const App = () => {
const store = useCreateStore(() =>
createStore().setTable('species', {dog: {price: 5}, cat: {price: 4}}),
);
const metrics = useCreateMetrics(store, (store) => {
console.log('Metrics created');
return createMetrics(store).setMetricDefinition(
'speciesCount',
'species',
);
});
return <span>{metrics?.getMetric('speciesCount')}</span>;
};
const app = document.createElement('div');
const root = createRoot(app);
root.render(<App />);
// -> 'Metrics created'
root.render(<App />);
// No second Metrics creation
console.log(app.innerHTML);
// -> '<span>2</span>'
This example creates a Metrics
object at the top level of a React application. The App component is rendered twice, each with a different top-level prop. The useCreateMetrics
hook takes the tableToCount prop as a dependency, and so the Metrics
object is created again on the second render.
import {createMetrics, createStore} from 'tinybase';
import {useCreateMetrics, useCreateStore} from 'tinybase/ui-react';
import React from 'react';
import {createRoot} from 'react-dom/client';
const App = ({tableToCount}) => {
const store = useCreateStore(() =>
createStore()
.setTable('pets', {fido: {species: 'dog'}})
.setTable('species', {dog: {price: 5}, cat: {price: 4}}),
);
const metrics = useCreateMetrics(
store,
(store) => {
console.log(`Count created for ${tableToCount} table`);
return createMetrics(store).setMetricDefinition(
'tableCount',
tableToCount,
);
},
[tableToCount],
);
return <span>{metrics?.getMetric('tableCount')}</span>;
};
const app = document.createElement('div');
const root = createRoot(app);
root.render(<App tableToCount="pets" />);
// -> 'Count created for pets table'
console.log(app.innerHTML);
// -> '<span>1</span>'
root.render(<App tableToCount="species" />);
// -> 'Count created for species table'
console.log(app.innerHTML);
// -> '<span>2</span>'
Since
v1.0.0