Web知识篇

什么是LocalStorage

浏览器里的"小仓库"

LocalStorage 是浏览器提供的一种本地存储机制,可以把数据保存在用户的浏览器中,即使关闭网页、重启电脑,数据依然存在。

💡 类比:LocalStorage 就像你桌上的便签本。记下的东西随时能查看,不用每次都打电话(发请求)问别人。

加载图表中...

为什么需要 LocalStorage?

HTTP 是无状态的——服务器不记得你上次做了什么。但很多场景需要"记住"一些东西:

场景需要记住什么用 LocalStorage
深色模式用户选了深色还是浅色
语言偏好用户选了中文还是英文
草稿保存用户写了一半的文章
购物车未登录用户加了什么商品
不再提示用户点了"不再显示此弹窗"

基本用法

LocalStorage 的 API 非常简单,只有几个方法:

// 存储数据
localStorage.setItem("theme", "dark");
localStorage.setItem("username", "张三");

// 读取数据
const theme = localStorage.getItem("theme");    // "dark"
const username = localStorage.getItem("username"); // "张三"

// 删除某一项
localStorage.removeItem("username");

// 清空所有数据
localStorage.clear();
加载图表中...

存储对象和数组

LocalStorage 只能存储字符串。要存对象或数组,需要用 JSON 转换:

// ❌ 错误:直接存对象,会变成 "[object Object]"
localStorage.setItem("user", { name: "张三" });

// ✅ 正确:先转成 JSON 字符串
const user = { name: "张三", age: 25 };
localStorage.setItem("user", JSON.stringify(user));

// 读取时再解析回来
const stored = localStorage.getItem("user");
const parsed = JSON.parse(stored);
console.log(parsed.name); // "张三"

封装一个好用的工具函数

// 存储(自动 JSON 序列化)
function setStorage(key, value) {
  localStorage.setItem(key, JSON.stringify(value));
}

// 读取(自动 JSON 解析)
function getStorage(key, defaultValue = null) {
  const item = localStorage.getItem(key);
  if (item === null) return defaultValue;
  try {
    return JSON.parse(item);
  } catch {
    return item;
  }
}

// 使用
setStorage("settings", { theme: "dark", lang: "zh" });
const settings = getStorage("settings", {}); // { theme: "dark", lang: "zh" }

实战:深色模式切换

"use client";
import { useState, useEffect } from "react";

function ThemeToggle() {
  const [isDark, setIsDark] = useState(false);

  // 组件加载时,从 LocalStorage 读取偏好
  useEffect(() => {
    const saved = localStorage.getItem("theme");
    if (saved === "dark") setIsDark(true);
  }, []);

  // 切换主题
  const toggle = () => {
    const newTheme = !isDark;
    setIsDark(newTheme);
    localStorage.setItem("theme", newTheme ? "dark" : "light");
  };

  return (
    <button onClick={toggle}>
      {isDark ? "🌙 深色模式" : "☀️ 浅色模式"}
    </button>
  );
}
加载图表中...

LocalStorage vs 其他存储方式

特性LocalStorageSessionStorageCookie
容量~5MB~5MB~4KB
生命周期永久(手动删除)关闭标签页清除可设置过期时间
发送到服务器❌ 不会❌ 不会✅ 每次请求自动携带
API简单简单复杂
适用场景用户偏好、草稿临时表单数据登录状态
加载图表中...

注意事项

注意点说明
只能存字符串对象/数组需要 JSON.stringify
同源限制不同域名的页面无法互相访问
不要存敏感数据Token、密码等不应该放在 LocalStorage
容量有限约 5MB,不适合存大文件
同步操作读写是同步的,大量数据可能阻塞页面
服务端不可用Next.js 服务端组件中不能使用

在 Next.js 中使用的注意点

"use client"; // ← 必须是客户端组件

import { useEffect, useState } from "react";

function MyComponent() {
  const [data, setData] = useState(null);

  useEffect(() => {
    // ✅ 在 useEffect 中使用,确保在浏览器环境
    const saved = localStorage.getItem("myData");
    if (saved) setData(JSON.parse(saved));
  }, []);

  // ❌ 不能在组件顶层直接调用(服务端渲染时 localStorage 不存在)
  // const data = localStorage.getItem("myData");  // 报错!
}

在 DevTools 中查看 LocalStorage

打开 F12 → Application → 左侧 Local Storage → 选择域名,即可看到所有存储的键值对。你也可以在这里手动添加、修改、删除数据。

🎯 AI编程小贴士:需要在项目中实现"记住用户偏好"功能?告诉 AI"帮我用 LocalStorage 实现一个深色模式切换,要在 Next.js 中使用",它会帮你处理好服务端渲染兼容等细节。

小结

  • LocalStorage 是浏览器的本地存储,数据永久保存
  • API 简单:setItemgetItemremoveItemclear
  • 只能存字符串,对象需要 JSON.stringify/parse 转换
  • 适合存用户偏好、草稿等非敏感数据
  • 在 Next.js 中必须在客户端组件useEffect 中使用
  • 不要存密码、Token 等敏感信息