Quick Start
This guide will walk you through the basics of nanostores-storage.
1. Create a Storage Store
A storage store binds a single key to a reactive nanostore atom.
import { createStorageStore, localStorageAdapter } from "@vp-tw/nanostores-storage";
// Create a store for user preferencesconst usernameStore = createStorageStore(localStorageAdapter, "username", { defaultValue: "Guest",});2. Read and Write Values
// Read current valueconst username = usernameStore.get();console.log(username); // "Guest" (or stored value)
// Update valueusernameStore.set("Alice");
// Remove value (resets to null)usernameStore.remove();3. Subscribe to Changes
// React to all changesusernameStore.$value.subscribe((value) => { console.log("Username changed:", value);});
// Or use listen() to skip the initial callusernameStore.$value.listen((value) => { console.log("Username updated to:", value);});4. Use with React
import { useStore } from "@nanostores/react";import { createStorageStore, localStorageAdapter } from "@vp-tw/nanostores-storage";
const usernameStore = createStorageStore(localStorageAdapter, "username", { defaultValue: "Guest",});
function UserGreeting() { const username = useStore(usernameStore.$value);
return ( <div> <p>Hello, {username}!</p> <input value={username ?? ""} onChange={(e) => usernameStore.set(e.target.value)} /> </div> );}<script setup>import { useStore } from "@nanostores/vue";import { createStorageStore, localStorageAdapter } from "@vp-tw/nanostores-storage";
const usernameStore = createStorageStore(localStorageAdapter, "username", { defaultValue: "Guest",});
const username = useStore(usernameStore.$value);</script>
<template> <div> <p>Hello, {{ username }}!</p> <input :value="username ?? ''" @input="usernameStore.set($event.target.value)" /> </div></template><script>import { createStorageStore, localStorageAdapter } from "@vp-tw/nanostores-storage";
const usernameStore = createStorageStore(localStorageAdapter, "username", { defaultValue: "Guest",});
// Svelte auto-subscribes with $ prefix$: username = $usernameStore.$value;</script>
<div> <p>Hello, {username}!</p> <input value={username ?? ""} on:input={(e) => usernameStore.set(e.target.value)} /></div>5. Enable Cross-Tab Sync
Listen for changes from other browser tabs:
const usernameStore = createStorageStore(localStorageAdapter, "username", { defaultValue: "Guest", listen: true, // Enable cross-tab sync});
// Or control manually:usernameStore.listener.on();usernameStore.listener.off();
// Check if listening:console.log(usernameStore.listener.$on.get()); // true/false6. Use sessionStorage
Simply swap the adapter:
import { createStorageStore, sessionStorageAdapter } from "@vp-tw/nanostores-storage";
const sessionStore = createStorageStore(sessionStorageAdapter, "session-data");Complete Example
import { createStorageStore, localStorageAdapter } from "@vp-tw/nanostores-storage";
// Theme preference with cross-tab syncconst themeStore = createStorageStore(localStorageAdapter, "theme", { defaultValue: "system", listen: true,});
// React to theme changesthemeStore.$value.subscribe((theme) => { document.documentElement.setAttribute("data-theme", theme ?? "system");});
// Toggle themefunction toggleTheme() { const current = themeStore.get(); const next = current === "dark" ? "light" : "dark"; themeStore.set(next);}Next Steps
- Storage Adapters — Learn about localStorage, sessionStorage, and custom adapters
- Fallback Chains — Use multiple storage backends
- API Reference — Full API documentation