2 changed files with 52 additions and 3 deletions
@ -0,0 +1,49 @@ |
|||||
|
import { useState, useEffect } from 'react' |
||||
|
|
||||
|
/** |
||||
|
* useLocalStorage hook |
||||
|
* @param {string} key localStorage key |
||||
|
* @param {any} initialValue 默认值 |
||||
|
* @returns {[any, Function]} [value, setValue] |
||||
|
*/ |
||||
|
function useLocalStorage(key, initialValue) { |
||||
|
// 读取 localStorage
|
||||
|
const readValue = () => { |
||||
|
try { |
||||
|
const item = window.localStorage.getItem(key) |
||||
|
return item !== null ? JSON.parse(item) : initialValue |
||||
|
} catch { |
||||
|
return initialValue |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
const [storedValue, setStoredValue] = useState(readValue) |
||||
|
|
||||
|
// 更新 localStorage
|
||||
|
const setValue = (value) => { |
||||
|
try { |
||||
|
const valueToStore = value instanceof Function ? value(storedValue) : value |
||||
|
setStoredValue(valueToStore) |
||||
|
window.localStorage.setItem(key, JSON.stringify(valueToStore)) |
||||
|
} catch { |
||||
|
setStoredValue(value) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 监听 key 变化或外部 localStorage 变化
|
||||
|
useEffect(() => { |
||||
|
setStoredValue(readValue()) |
||||
|
// 监听 localStorage 变化(多标签页同步)
|
||||
|
const handleStorage = (event) => { |
||||
|
if (event.key === key) { |
||||
|
setStoredValue(readValue()) |
||||
|
} |
||||
|
} |
||||
|
window.addEventListener('storage', handleStorage) |
||||
|
return () => window.removeEventListener('storage', handleStorage) |
||||
|
}, [key]) |
||||
|
|
||||
|
return [storedValue, setValue] |
||||
|
} |
||||
|
|
||||
|
export default useLocalStorage |
||||
Loading…
Reference in new issue