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