useLocalStorage 本地存储钩子

最后更新:2026-10-28

useLocalStorage 本地存储钩子

useLocalStorage 把 useState 的读写同步到 localStorage:初始化时惰性读取已存值,更新时自动写回磁盘,刷新页面后状态仍在。它是「自定义 Hook 包装原生 API」的典型示范。

分组组件模式
类型Hook
引入版本React 16.8

ℹ️ 说明 编辑器将 JSX 转译为 JavaScript 后在沙箱中渲染真实界面;组件自动挂载,无需手写 render 调用。

📝 语法

function useLocalStorage(key, initial) {
  const [value, setValue] = useState(() => {
    const saved = localStorage.getItem(key)      // 惰性初始化:只读一次
    return saved !== null ? JSON.parse(saved) : initial
  })
  useEffect(() => {
    localStorage.setItem(key, JSON.stringify(value))
  }, [key, value])
  return [value, setValue]
}

⚙️ 参数

keylocalStorage 的存储键名,建议带应用前缀避免冲突。
initial本地没有存值时的初始值,支持任意可 JSON 序列化的类型。

返回值:返回 [value, setValue] 二元组,用法与 useState 完全一致,但读写已自动持久化到 localStorage。

▶ 示例

示例可直接运行:展开后自动渲染,编辑代码即时生效。

输出结果:

点按钮计数增加并写入 localStorage;刷新或重开页面后计数仍在,点「清零」归零。

💡 要点

💡 提示 初始化传函数做惰性读取,避免每次渲染都访问 localStorage(同步 IO,开销不小)。
ℹ️ 说明 存对象/数组要用 JSON 序列化;读取时建议 try/catch 防御脏数据或手改过的值。
⚠️ 注意 localStorage 同源共享且有约 5MB 上限,敏感数据(如 token)不建议明文存放。
更多案例整理中,敬请期待。

📚 相关教程

❓ 常见问题

Q SSR 下会报错吗?
A 会,服务端没有 window/localStorage。需在读取处判空(typeof window)或放到 useEffect 里。
Q 和直接用 useState 的区别?
A 多了一层持久化:初始值来自磁盘、每次变更自动写回,API 与 useState 保持一致。
Q 存对象为什么要 JSON.stringify?
A localStorage 只能存字符串;不序列化会得到 "[object Object]",读回来无法还原。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏