Skip to content

Instantly share code, notes, and snippets.

@srph
Last active April 15, 2020 14:23
Show Gist options
  • Save srph/e7cee9cd168f0928fccc822bcd62686d to your computer and use it in GitHub Desktop.
Save srph/e7cee9cd168f0928fccc822bcd62686d to your computer and use it in GitHub Desktop.
React: useLocalStorageState hook

Usage

A drop-in replacement for useState if you want to persist your state to localStorage

interface Item {
  qty: number
  product: {
    id: number
    name: string
    price: number
  }
}

const Hello = () => {
-  const [value, setValue] = useState<Item[]>('cart', [])
+  const [value, setValue] = useLocalStorageState<Item[]>('cart', [])
  // ...
}
import { useState } from 'react'
const useLocalStorageState = <T>(key: string, defaultValue?: T): [T, (value: T) => void] => {
const [state, internalSetState] = useState<T>(() => {
try {
const value = localStorage.getItem(key)
if (value) return JSON.parse(value)
} catch (e) {
console.error(e)
}
return defaultValue
})
const setLocalStorageState = value => {
internalSetState(value)
localStorage.setItem(key, JSON.stringify(value))
}
return [state, setLocalStorageState]
}
export { useLocalStorageState }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment