React hook that persists data in localStorage
Installations
npm install use-local-storage-state
Developer
astoilkov
Developer Guide
Module System
ESM
Min. Node Version
>=14
Typescript Support
No
Node Version
NPM Version
Statistics
1,167 Stars
524 Commits
41 Forks
7 Watching
4 Branches
12 Contributors
Updated on 27 Nov 2024
Bundle Size
1.63 kB
Minified
780.00 B
Minified + Gzipped
Languages
TypeScript (98.09%)
JavaScript (1.91%)
Total Downloads
Cumulative downloads
Total Downloads
10,592,715
Last day
-0.2%
22,729
Compared to previous day
Last week
4.8%
117,109
Compared to previous week
Last month
13.1%
478,621
Compared to previous month
Last year
37%
4,660,476
Compared to previous year
Daily Downloads
Weekly Downloads
Monthly Downloads
Yearly Downloads
Dev Dependencies
25
use-local-storage-state
React hook that persist data in
localStorage
Install
React 18 and above:
1npm install use-local-storage-state
⚠️ React 17 and below. For docs, go to the react-17 branch.
1npm install use-local-storage-state@17
Why
- Actively maintained for the past 4 years — see contributors page.
- Production ready.
- 689 B (brotlied).
- SSR support.
- Works with React 18 concurrent rendering and React 19.
- Handles the
Window
storage
event and updates changes across browser tabs, windows, and iframe's. Disable withstorageSync: false
. - In-memory fallback when
localStorage
throws an error and can't store the data. Provides aisPersistent
API to let you notify the user their data isn't currently being stored. - Aiming for high-quality with my open-source principles.
Usage
1import useLocalStorageState from 'use-local-storage-state' 2 3export default function Todos() { 4 const [todos, setTodos] = useLocalStorageState('todos', { 5 defaultValue: ['buy avocado', 'do 50 push-ups'] 6 }) 7}
Todo list example
1import React, { useState } from 'react' 2import useLocalStorageState from 'use-local-storage-state' 3 4export default function Todos() { 5 const [todos, setTodos] = useLocalStorageState('todos', { 6 defaultValue: ['buy avocado'] 7 }) 8 const [query, setQuery] = useState('') 9 10 function onClick() { 11 setQuery('') 12 setTodos([...todos, query]) 13 } 14 15 return ( 16 <> 17 <input value={query} onChange={e => setQuery(e.target.value)} /> 18 <button onClick={onClick}>Create</button> 19 {todos.map(todo => ( 20 <div>{todo}</div> 21 ))} 22 </> 23 ) 24} 25
Notify the user when localStorage
isn't saving the data using the isPersistent
property
There are a few cases when localStorage
isn't available. The isPersistent
property tells you if the data is persisted in localStorage
or in-memory. Useful when you want to notify the user that their data won't be persisted.
1import React, { useState } from 'react' 2import useLocalStorageState from 'use-local-storage-state' 3 4export default function Todos() { 5 const [todos, setTodos, { isPersistent }] = useLocalStorageState('todos', { 6 defaultValue: ['buy avocado'] 7 }) 8 9 return ( 10 <> 11 {todos.map(todo => (<div>{todo}</div>))} 12 {!isPersistent && <span>Changes aren't currently persisted.</span>} 13 </> 14 ) 15} 16
Removing the data from localStorage
and resetting to the default
The removeItem()
method will reset the value to its default and will remove the key from the localStorage
. It returns to the same state as when the hook was initially created.
1import useLocalStorageState from 'use-local-storage-state' 2 3export default function Todos() { 4 const [todos, setTodos, { removeItem }] = useLocalStorageState('todos', { 5 defaultValue: ['buy avocado'] 6 }) 7 8 function onClick() { 9 removeItem() 10 } 11}
Why my component renders twice?
If you are hydrating your component (for example, if you are using Next.js), your component might re-render twice. This is behavior specific to React and not to this library. It's caused by the useSyncExternalStore()
hook. There is no workaround. This has been discussed in the issues: https://github.com/astoilkov/use-local-storage-state/issues/56.
If you want to know if you are currently rendering the server value you can use this helper function:
1function useIsServerRender() { 2 return useSyncExternalStore(() => { 3 return () => {} 4 }, () => false, () => true) 5}
API
useLocalStorageState(key: string, options?: LocalStorageOptions)
Returns [value, setValue, { removeItem, isPersistent }]
when called. The first two values are the same as useState()
. The third value contains two extra properties:
removeItem()
— callslocalStorage.removeItem(key)
and resets the hook to it's default stateisPersistent
—boolean
property that returnsfalse
iflocalStorage
is throwing an error and the data is stored only in-memory
key
Type: string
The key used when calling localStorage.setItem(key)
and localStorage.getItem(key)
.
⚠️ Be careful with name conflicts as it is possible to access a property which is already in localStorage
that was created from another place in the codebase or in an old version of the application.
options.defaultValue
Type: any
Default: undefined
The default value. You can think of it as the same as useState(defaultValue)
.
options.defaultServerValue
Type: any
Default: undefined
The default value while server-rendering and hydrating. If not set, it will use defaultValue
option instead. Set only if you want it to be different than the client value.
options.storageSync
Type: boolean
Default: true
Setting to false
doesn't subscribe to the Window storage event. If you set to false
, updates won't be synchronized across tabs, windows and iframes.
options.serializer
Type: { stringify, parse }
Default: JSON
JSON does not serialize Date
, Regex
, or BigInt
data. You can pass in superjson or other JSON
-compatible serialization library for more advanced serialization.
Related
use-storage-state
— SupportslocalStorage
,sessionStorage
, and any otherStorage
compatible API.use-session-storage-state
— A clone of this library but forsessionStorage
.use-db
— Similar to this hook but forIndexedDB
.local-db-storage
— Tiny wrapper aroundIndexedDB
that mimicslocalStorage
API.
No vulnerabilities found.
Reason
no binaries found in the repo
Reason
11 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10
Reason
no dangerous workflow patterns detected
Reason
0 existing vulnerabilities detected
Reason
license file detected
Details
- Info: project has a license file: license:0
- Info: FSF or OSI recognized license: MIT License: license:0
Reason
Found 2/28 approved changesets -- score normalized to 0
Reason
detected GitHub workflow tokens with excessive permissions
Details
- Warn: no topLevel permission defined: .github/workflows/main.yml:1
- Info: no jobLevel write permissions found
Reason
dependency not pinned by hash detected -- score normalized to 0
Details
- Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/astoilkov/use-local-storage-state/main.yml/main?enable=pin
- Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/astoilkov/use-local-storage-state/main.yml/main?enable=pin
- Info: 0 out of 2 GitHub-owned GitHubAction dependencies pinned
Reason
no effort to earn an OpenSSF best practices badge detected
Reason
project is not fuzzed
Details
- Warn: no fuzzer integrations found
Reason
branch protection not enabled on development/release branches
Details
- Warn: branch protection not enabled for branch 'main'
Reason
security policy file not detected
Details
- Warn: no security policy file detected
- Warn: no security file to analyze
- Warn: no security file to analyze
- Warn: no security file to analyze
Reason
SAST tool is not run on all commits -- score normalized to 0
Details
- Warn: 0 commits out of 4 are checked with a SAST tool
Score
4.4
/10
Last Scanned on 2024-11-25
The Open Source Security Foundation is a cross-industry collaboration to improve the security of open source software (OSS). The Scorecard provides security health metrics for open source projects.
Learn MoreOther packages similar to use-local-storage-state
tg-use-local-storage-state
React hook that persists data in localStorage
state-local
Tiny, simple, and robust technique for defining and acting with local states
use-session-storage-state
React hook that persist data in sessionStorage
nestjs-cls
A continuation-local storage module compatible with NestJS's dependency injection.