typescriptbeginner

usePersistentState Hook

Like useState but persists to localStorage with JSON serialization and SSR safety.

typescript
import { useState, useEffect } from 'react';

export function usePersistentState<T>(key: string, defaultValue: T): [T, (value: T | ((prev: T) => T)) => void] {
  const [state, setState] = useState<T>(() => {
    if (typeof window === 'undefined') return defaultValue;
    try {
      const stored = localStorage.getItem(key);
      return stored !== null ? JSON.parse(stored) : defaultValue;
    } catch {
      return defaultValue;
    }
  });

  useEffect(() => {
    try {
      localStorage.setItem(key, JSON.stringify(state));
    } catch { /* storage full or private mode */ }
  }, [key, state]);

  return [state, setState];
}

// Usage:
// const [filters, setFilters] = usePersistentState('search-filters', { sort: 'date' });

Use Cases

  • Persisting user preferences
  • Form draft saving

Tags

Related Snippets

Similar patterns you can reuse in the same workflow.