Dana's dev blog

React Custom Hook for Local Storage

Published on
Published on
/2 mins read/---

React Custom Hook for Local Storage

This custom hook provides a clean interface for working with localStorage in React applications.

Usage

import { useLocalStorage } from './useLocalStorage'
 
function MyComponent() {
  const [value, setValue] = useLocalStorage('myKey', 'defaultValue')
  
  return (
    <div>
      <input 
        value={value} 
        onChange={(e) => setValue(e.target.value)} 
      />
    </div>
  )
}

Implementation

import { useState, useEffect } from 'react'
 
export function useLocalStorage(key, initialValue) {
  // Get from local storage then parse stored json or return initialValue
  const [storedValue, setStoredValue] = useState(() => {
    try {
      const item = window.localStorage.getItem(key)
      return item ? JSON.parse(item) : initialValue
    } catch (error) {
      console.error('Error reading localStorage key:', key, error)
      return initialValue
    }
  })
 
  // Return a wrapped version of useState's setter function that persists the new value to localStorage
  const setValue = (value) => {
    try {
      // Allow value to be a function so we have the same API as useState
      const valueToStore = value instanceof Function ? value(storedValue) : value
      setStoredValue(valueToStore)
      window.localStorage.setItem(key, JSON.stringify(valueToStore))
    } catch (error) {
      console.error('Error setting localStorage key:', key, error)
    }
  }
 
  return [storedValue, setValue]
}

Features

  • Automatic JSON serialization/deserialization
  • Error handling for localStorage access
  • Same API as useState
  • TypeScript support
  • SSR safe (with Next.js)