11// @flow
22
3- import { useLayoutEffect , useState } from 'react' ;
3+ import { useCallback , useLayoutEffect , useState } from 'react' ;
44
55// Forked from https://usehooks.com/useLocalStorage/
66export function useLocalStorage < T > (
77 key : string ,
88 initialValue : T
99) : [ T , ( value : T | ( ( ) => T ) ) => void ] {
10- const getValueFromLocalStorage = ( ) => {
10+ const getValueFromLocalStorage = useCallback ( ( ) => {
1111 try {
1212 const item = window . localStorage . getItem ( key ) ;
1313 return item ? JSON . parse ( item ) : initialValue ;
1414 } catch ( error ) {
1515 console . log ( error ) ;
1616 return initialValue ;
1717 }
18- } ;
18+ } , [ initialValue , key ] ) ;
1919
2020 const [ storedValue , setStoredValue ] = useState ( getValueFromLocalStorage ) ;
2121
22- const setValue = value => {
23- try {
24- const valueToStore =
25- value instanceof Function ? value ( storedValue ) : value ;
26- setStoredValue ( valueToStore ) ;
27- window . localStorage . setItem ( key , JSON . stringify ( valueToStore ) ) ;
28- } catch ( error ) {
29- console . log ( error ) ;
30- }
31- } ;
22+ const setValue = useCallback (
23+ value => {
24+ try {
25+ const valueToStore =
26+ value instanceof Function ? value ( storedValue ) : value ;
27+ setStoredValue ( valueToStore ) ;
28+ window . localStorage . setItem ( key , JSON . stringify ( valueToStore ) ) ;
29+ } catch ( error ) {
30+ console . log ( error ) ;
31+ }
32+ } ,
33+ [ key , storedValue ]
34+ ) ;
3235
3336 // Listen for changes to this local storage value made from other windows.
3437 // This enables the e.g. "⚛️ Elements" tab to update in response to changes from "⚛️ Settings".
@@ -45,7 +48,7 @@ export function useLocalStorage<T>(
4548 return ( ) => {
4649 window . removeEventListener ( 'storage' , onStorage ) ;
4750 } ;
48- } , [ key , storedValue ] ) ;
51+ } , [ getValueFromLocalStorage , key , storedValue , setValue ] ) ;
4952
5053 return [ storedValue , setValue ] ;
5154}
0 commit comments