useCreateStore
The useCreateStore
hook is used to create a Store
within a React application with convenient memoization.
useCreateStore(
create: () => Store,
createDeps?: DependencyList,
): Store
Type | Description | |
---|---|---|
create | () => Store | A function for performing the creation of the |
createDeps? | DependencyList | An optional array of dependencies for the |
returns | Store | A reference to the |
It is possible to create a Store
outside of the React app with the regular createStore
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 Store
being created every time the app renders or re-renders, the useCreateStore
hook wraps the creation in a memoization.
The useCreateStore
hook is a very thin wrapper around the React useMemo
hook, defaulting to an empty array for its dependencies, so that by default, the creation only occurs once.
If your create
function contains other dependencies, the changing of which should cause the Store
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.
Examples
This example creates an empty Store
at the top level of a React application. Even though the App component is rendered twice, the Store
creation only occurs once by default.
import React from 'react';
import {createRoot} from 'react-dom/client';
import {createStore} from 'tinybase';
import {useCreateStore} from 'tinybase/ui-react';
const App = () => {
const store = useCreateStore(() => {
console.log('Store created');
return createStore().setTables({pets: {fido: {species: 'dog'}}});
});
return <span>{store.getCell('pets', 'fido', 'species')}</span>;
};
const app = document.createElement('div');
const root = createRoot(app);
root.render(<App />);
// -> 'Store created'
root.render(<App />);
// No second Store creation
console.log(app.innerHTML);
// -> '<span>dog</span>'
This example creates an empty Store
at the top level of a React application. The App component is rendered twice, each with a different top-level prop. The useCreateStore
hook takes the fidoSpecies
prop as a dependency, and so the Store
is created again on the second render.
import React from 'react';
import {createRoot} from 'react-dom/client';
import {createStore} from 'tinybase';
import {useCreateStore} from 'tinybase/ui-react';
const App = ({fidoSpecies}) => {
const store = useCreateStore(() => {
console.log(`Store created for fido as ${fidoSpecies}`);
return createStore().setTables({pets: {fido: {species: fidoSpecies}}});
}, [fidoSpecies]);
return <span>{store.getCell('pets', 'fido', 'species')}</span>;
};
const app = document.createElement('div');
const root = createRoot(app);
root.render(<App fidoSpecies="dog" />);
// -> 'Store created for fido as dog'
console.log(app.innerHTML);
// -> '<span>dog</span>'
root.render(<App fidoSpecies="cat" />);
// -> 'Store created for fido as cat'
console.log(app.innerHTML);
// -> '<span>cat</span>'
Since
v1.0.0