DeepWiki Knowledge Base Document -> react-idb-toolkit
⚛️ Elegant and easy-to-use React toolkit for managing local data with IndexedDB, powered by idb.
A lightweight, simple React hook for storing structured data in the browser via IndexedDB. Supports multiple store initialization, common CRUD operations (get/set/delete/clear), with full TypeScript support and test cases.
Visit Example | Visit Storybook Example
npm install react-idb-toolkit
# or
yarn add react-idb-toolkit- ✅ Simple API powered by
idb - 🔁 Automatically creates multiple object stores
- 🧪 Built-in unit tests with Vitest
- 📖 Interactive Storybook Playground
- 🧠 Fully based on React Hooks with type inference and generics
- 📦 Zero external dependencies (except for
idb)
import { useIndexedDBState } from 'react-idb-toolkit';
export const CounterExample = () => {
const [count, setCount, { loading }] = useIndexedDBState<number>({
storeName: "demoStore",
key: "counter",
defaultValue: 0,
});
return (
<div className="p-6 text-center space-y-4">
<h2 className="text-xl font-semibold">Persistent Counter</h2>
<p className="text-4xl font-bold">{loading ? "..." : count}</p>
<div className="flex gap-2 justify-center">
<button onClick={() => setCount((c) => c + 1)}>Increment</button>
<button variant="outline" onClick={() => setCount(0)}>
Reset
</button>
</div>
</div>
)
};interface UseIndexedDBStateOptions<T> {
storeName: string;
key: IDBValidKey;
defaultValue?: T | (() => T);
onError?: (error: Error) => void;
}[
value: T;
setValue: React.Dispatch<React.SetStateAction<T>>;
{
loading: boolean;
sync: () => Promise<...>;
}
]import {
IndexedDBStateProvider,
useIndexedDBStateContext,
} from 'react-idb-toolkit';
const DemoComponent = () => {
const [value, setValue] = useIndexedDBStateContext<string>("demoKey", "default");
return (
<div className="p-4 space-y-4">
<input value={value} onChange={(e) => setValue(e.target.value)} />
<p>Current value: {value}</p>
</div>
);
};
export const SingleContextUsage = () => (
<IndexedDBStateProvider storeName="context-store">
<div className="flex items-center justify-center h-screen bg-gray-100">
<div className="p-6 space-y-6 max-w-md w-full">
<h2 className="text-xl font-semibold">Context Demo</h2>
<DemoComponent />
</div>
</div>
</IndexedDBStateProvider>
);interface IndexedDBStateProviderProps {
storeName: string;
children: React.ReactNode;
}
// context params
{
key: IDBValidKey,
defaultValue?: T
}interface UseIndexedDBStateContextReturn<T> {
value: T;
updateValue: React.Dispatch<React.SetStateAction<T>>;
loading: boolean;
}import { useIndexedDB } from 'react-idb-toolkit';
const { loading, setItem, getItem, deleteItem, clear, getAll, keys } = useIndexedDB({
dbName: 'myDatabase',
storeNames: ['myStore'],
});
useEffect(() => {
if (!loading) {
setItem('myStore', 'userName', 'demo');
}
}, [loading]);interface UseIndexedDBOptions {
dbName: string; // Database name
version?: number; // Database version, default is 1
storeNames: string[]; // List of object store names
}interface UseIndexedDBReturn {
loading: boolean;
getItem: <T>(storeName: string, key: IDBValidKey) => Promise<T | undefined>;
setItem: <T>(storeName: string, key: IDBValidKey, value: T) => Promise<void>;
deleteItem: (storeName: string, key: IDBValidKey) => Promise<void>;
clear: (storeName: string) => Promise<void>;
getAll: <T>(storeName: string) => Promise<T[] | undefined>;
keys: (storeName: string) => Promise<IDBValidKey[] | undefined>;
}import { IndexedDBProvider } from 'react-idb-toolkit';
<IndexedDBProvider
options={{
dbName: "storybook-db",
storeNames: ["demoStore"],
}}
>
<PlaygroundContent />
</IndexedDBProvider>import { useIndexedDBContext } from 'react-idb-toolkit';
const { loading, setItem, getItem, deleteItem, getAll, keys, clear } =
useIndexedDBContext();
useEffect(() => {
if (!loading) {
setItem('demoStore', 'userName', 'demo');
}
}, [loading]);interface IndexedDBOptions {
dbName: string; // Database name
version?: number; // Database version, default is 1
storeNames: string[]; // List of object store names
}
interface IndexedDBProviderProps {
children: ReactNode;
options: IndexedDBOptions;
}interface UseIndexedDBReturn {
loading: boolean;
getItem: <T>(storeName: string, key: IDBValidKey) => Promise<T | undefined>;
setItem: <T>(storeName: string, key: IDBValidKey, value: T) => Promise<void>;
deleteItem: (storeName: string, key: IDBValidKey) => Promise<void>;
clear: (storeName: string) => Promise<void>;
getAll: <T>(storeName: string) => Promise<T[] | undefined>;
keys: (storeName: string) => Promise<IDBValidKey[] | undefined>;
}import { initIndexedDB, getIndexedDBHelper } from "./toolkit";
let db: IndexedDBHelper | null = null;
useEffect(() => {
initIndexedDB({
dbName: "storybook-db",
storeNames: ["demoStore"],
}).then(() => {
db = getIndexedDBHelper();
const { setItem, getItem, deleteItem, clear, getAll, keys } = db;
setItem("demoStore", "userName", "demo");
});
}, []);interface IndexedDBOptions {
dbName: string; // Database name
version?: number; // Database version, default is 1
storeNames: string[]; // List of object store names
}interface UseIndexedDBReturn {
loading: boolean; // Indicates if DB is still initializing
getItem<T>(store, key): Promise<T | undefined>;
setItem<T>(store, key, value): Promise<void>;
deleteItem(store, key): Promise<void>;
clear(store): Promise<void>;
getAll<T>(store): Promise<T[]>;
keys(store): Promise<IDBValidKey[]>;
}Tests are written using Vitest, with fake-indexeddb to simulate browser environment:
npm testCovered test cases include:
- Data insertion, retrieval, deletion, and clearing
- Fetching all keys and values
- Error handling when DB is not initialized
Start an interactive Storybook playground with:
npm run storybookYou can:
- Add key/value data manually
- View all keys and values
- Delete or clear data
- Observe dynamic hints and state updates
Perfect for debugging and demos.
git clone https://github.com/aiyoudiao/react-idb-toolkit.git
cd react-idb-toolkit
npm install
# Run tests
npm run test:ui
# Start Demo
npm run dev:demoMIT License © aiyoudiao
- idb: A modern IndexedDB wrapper
- fake-indexeddb: Mock IndexedDB implementation for Node.js
- Vitest: A fast and modern unit testing framework
- Storybook: Tool for building UI component demos interactively



