Skip to content

useLocalStorage

A React hook that synchronizes state with localStorage.


✨ Overview

useLocalStorage provides a simple API to read, write, and remove values from localStorage,
keeping your React state in sync with persistent browser storage.


📦 Import

tsx
import { useLocalStorage } from 'react-hookstack';

🚀 Usage Example

tsx
import { useLocalStorage } from 'react-hookstack';

const [user, setUser, removeUser] = useLocalStorage("user", { name: "John" });

setUser({ name: "Jane" }); // Update
removeUser(); // Remove

🧩 API Reference

useLocalStorage<T>(key: string, initialValue: T): [T, (value: T | ((prev: T) => T)) => void, () => void]

Parameters

ParameterTypeDescription
keystringThe localStorage key to read/write.
initialValueTThe initial value if localStorage is empty.

Returns

PropertyTypeDescription
valueTCurrent stored value.
setValue(value: T | (prev: T) => T) => voidSetter function.
removeValue() => voidRemoves the value from storage.

⚙️ Implementation

tsx
import { useState, useEffect } from "react";

export function useLocalStorage<T>(key: string, initialValue: T) {
    // Retrieve stored value or fallback to initialValue
    const readValue = (): T => {
        if (typeof window === "undefined") return initialValue;

        try {
            const item = window.localStorage.getItem(key);
            return item ? (JSON.parse(item) as T) : initialValue;
        } catch (error) {
            console.warn(
                `[react-handyhooks]: Error reading localStorage key “${key}”:`,
                error
            );
            return initialValue;
        }
    };

    const [storedValue, setStoredValue] = useState<T>(readValue);

    // Sync state to localStorage
    const setValue = (value: T | ((prev: T) => T)) => {
        try {
            const newValue =
                value instanceof Function ? value(storedValue) : value;
            setStoredValue(newValue);
            if (typeof window !== "undefined") {
                window.localStorage.setItem(key, JSON.stringify(newValue));
            }
        } catch (error) {
            console.warn(
                `[react-handyhooks]: Error setting localStorage key “${key}”:`,
                error
            );
        }
    };

    // Remove the value from localStorage
    const removeValue = () => {
        try {
            setStoredValue(initialValue);
            if (typeof window !== "undefined") {
                window.localStorage.removeItem(key);
            }
        } catch (error) {
            console.warn(
                `[react-handyhooks]: Error removing localStorage key “${key}”:`,
                error
            );
        }
    };

    // Listen for changes from other tabs/windows
    useEffect(() => {
        const handleStorageChange = (event: StorageEvent) => {
            if (event.key === key) {
                setStoredValue(
                    event.newValue ? JSON.parse(event.newValue) : initialValue
                );
            }
        };

        window.addEventListener("storage", handleStorageChange);
        return () => window.removeEventListener("storage", handleStorageChange);
    }, [key]);

    return [storedValue, setValue, removeValue] as const;
}

💡 Notes

  • Listens for changes from other tabs/windows.
  • Handles JSON serialization automatically.

🧾 Type Definition

tsx
function useLocalStorage<T>(
  key: string,
  initialValue: T
): [T, (value: T | ((prev: T) => T)) => void, () => void];

🧭 Summary

FeatureDescription
🧱 PersistentSyncs state with localStorage
⚡ LightweightNo dependencies
🧠 IntuitiveSimple API surface