Skip to content

浏览器数据存储

JavaScript 中 sessionStorage、localStorage 和 Cookie 是客户端数据存储的三种主要方式

常用操作(CRUD)

ts
export enum StorageType {
  Cookie = "cookie",
  Local = "localStorage",
  Session = "sessionStorage",
}

/**
 * 设置存储
 * @param key 键名
 * @param value 值(复杂类型会自动序列化)
 * @param type 存储类型
 * @param expires 过期秒数(仅 Cookie 有效,默认30分钟)
 */
export function setData(
  key: string,
  value: any,
  type: StorageType = StorageType.Local,
  expires: number = 60 * 60 * 30
): void {
  const serializedValue =
    typeof value === "string" ? value : JSON.stringify(value);

  switch (type) {
    case StorageType.Cookie:
      const date = new Date();
      date.setTime(date.getTime() + expires * 1000);
      document.cookie = `${key}=${encodeURIComponent(
        serializedValue
      )}; expires=${date.toUTCString()}; path=/`;
      break;
    case StorageType.Local:
      localStorage.setItem(key, serializedValue);
      break;
    case StorageType.Session:
      sessionStorage.setItem(key, serializedValue);
      break;
  }
}

/**
 * 获取存储
 * @param key 键名
 * @param type 存储类型
 * @returns 解析后的值(不存在则返回 null)
 */
export function getData<T>(
  key: string,
  type: StorageType = StorageType.Local
): T | null {
  let value: string | null = null;

  switch (type) {
    case StorageType.Cookie:
      const cookies = document.cookie.split("; ");
      for (const cookie of cookies) {
        const [cookieKey, cookieValue] = cookie.split("=");
        if (cookieKey === key) {
          value = cookieValue ? decodeURIComponent(cookieValue) : null;
          break;
        }
      }
      break;
    case StorageType.Local:
      value = localStorage.getItem(key);
      break;
    case StorageType.Session:
      value = sessionStorage.getItem(key);
      break;
  }

  if (!value) return null;

  // 尝试解析 JSON(处理对象/数组)
  try {
    return JSON.parse(value) as T;
  } catch {
    // 非 JSON 字符串直接返回
    return value as unknown as T;
  }
}

/**
 * 删除存储
 * @param key 键名
 * @param type 存储类型
 */
export function removeData(
  key: string,
  type: StorageType = StorageType.Local
): void {
  switch (type) {
    case StorageType.Cookie:
      document.cookie = `${key}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;
      break;
    case StorageType.Local:
      localStorage.removeItem(key);
      break;
    case StorageType.Session:
      sessionStorage.removeItem(key);
      break;
  }
}

/**
 * 清空存储(Cookie 需逐个删除)
 * @param type 存储类型
 */
export function clearData(type: StorageType = StorageType.Local): void {
  switch (type) {
    case StorageType.Cookie:
      document.cookie.split("; ").forEach((cookie) => {
        const key = cookie.split("=")[0];
        if (key) {
          this.remove(key?.toString() ?? "", StorageType.Cookie);
        }
      });
      break;
    case StorageType.Local:
      localStorage.clear();
      break;
    case StorageType.Session:
      sessionStorage.clear();
      break;
  }
}

使用示例

ts
// 存储用户信息到 localStorage
setData("user", { id: 1, name: "John" }, StorageType.Local);
// 存储临时令牌到 sessionStorage
setData("token", "abc123", StorageType.Session);
// 存储偏好设置到 Cookie(有效期 30 天)
setData("theme", "dark", StorageType.Cookie, 30);
// 读取数据
const user = getData<{ id: number; name: string }>("user");
const token = getData<string>("token", StorageType.Session);
// 删除数据
removeData("theme", StorageType.Cookie);
// 清空所有 localStorage 数据
clearData(StorageType.Local);