Vue3 + TypeScript 本地存储 localStorage 的用法

1、字符串

直接操作

TypeScript 复制代码
// 存储表格列宽
localStorage.setItem(`${tableName.value}_${prop}_colWidth`, newWidth.toString());

// 获取表格列宽
let storageColWidth = localStorage.getItem(`${tableName.value}_${prop}_colWidth`);

// 删除本地存储的列宽数据
localStorage.removeItem(`${tableName.value}_${prop}_colWidth`);

2、对象

写:JSON.stringify

读:JSON.parse

TypeScript 复制代码
  // 定义表格列宽对象
  interface ITableColumnWidth {
    // 列标识符
    [key: string]: number;
  }
  // 表格列宽对象
  const tableColumnWidth = ref<ITableColumnWidth>({});
  // 表格列宽 key
  const tableColKey = computed(() => `${tableName.value}_colWidth`);

  // 存储表格列宽
  localStorage.setItem(tableColKey.value, JSON.stringify(tableColumnWidth.value));

  // 获取表格列宽
  const loadColumnWidthFormLocalStorage = () => {
    try {
      let value = localStorage.getItem(tableColKey.value);

      // 处理空值情况
      if (!value) {
        return;
      }

      // 安全解析并验证类型
      let parsed = JSON.parse(value);
      // 普通对象 {} 或 new Object() 创建的对象
      if (Object.prototype.toString.call(parsed) === "[object Object]") {
        tableColumnWidth.value = parsed;
      } else {
        console.warn("Invalid localStorage data format.");
      }
    } catch (e) {
      console.error("Error parsing localStorage data:", e);
    }
  };

  // 删除本地存储的列宽数据
  localStorage.removeItem(tableColKey.value);

3、数组

写:JSON.stringify

读:JSON.parse

TypeScript 复制代码
// 本地存储的申领用途
const localStoragePurposeSet = ref<Set<string>>(new Set());

// 保存申领用途到 localStorage
const savePurposeToLocalStorage = () => {
  // 创建新 Set 以触发响应式更新
  const newSet = new Set(localStoragePurposeSet.value);
  newSet.add(purposeVal.value.trim());

  // 更新响应式数据
  localStoragePurposeSet.value = newSet;

  // 存储到 localStorage,需转换为数组(Set 集合不能直接存储到 localStorage 中,需要转换为数组)
  const purposes = Array.from(newSet);
  localStorage.setItem("reagentApplyPurposes", JSON.stringify(purposes));
};

// 从 localStorage 中获取申领用途
const getPurposeFormLocalStorage = () => {
  try {
    const storedData = localStorage.getItem("reagentApplyPurposes");

    // 处理空值情况
    if (!storedData) {
      localStoragePurposeSet.value = new Set();
      return;
    }

    // 安全解析并验证类型
    const parsed: unknown = JSON.parse(storedData);
    if (Array.isArray(parsed) && parsed.every((item) => typeof item === "string")) {
      localStoragePurposeSet.value = new Set(parsed as string[]);
    } else {
      console.warn("Invalid localStorage data format. Resetting to empty Set.");
      localStoragePurposeSet.value = new Set();
    }
  } catch (e) {
    console.error("Error parsing localStorage data:", e);
    localStoragePurposeSet.value = new Set();
  }
};
相关推荐
敲敲了个代码7 小时前
从硬编码到 Schema 推断:前端表单开发的工程化转型
前端·javascript·vue.js·学习·面试·职场和发展·前端框架
张雨zy8 小时前
Pinia 与 TypeScript 完美搭配:Vue 应用状态管理新选择
vue.js·ubuntu·typescript
dly_blog8 小时前
Vue 响应式陷阱与解决方案(第19节)
前端·javascript·vue.js
消失的旧时光-19439 小时前
401 自动刷新 Token 的完整架构设计(Dio 实战版)
开发语言·前端·javascript
console.log('npc')9 小时前
Table,vue3在父组件调用子组件columns列的方法展示弹窗文件预览效果
前端·javascript·vue.js
用户47949283569159 小时前
React Hooks 的“天条”:为啥绝对不能写在 if 语句里?
前端·react.js
我命由我123459 小时前
SVG - SVG 引入(SVG 概述、SVG 基本使用、SVG 使用 CSS、SVG 使用 JavaScript、SVG 实例实操)
开发语言·前端·javascript·css·学习·ecmascript·学习方法
用户479492835691510 小时前
给客户做私有化部署,我是如何优雅搞定 NPM 依赖管理的?
前端·后端·程序员
C_心欲无痕10 小时前
vue3 - markRaw标记为非响应式对象
前端·javascript·vue.js
qingyun98910 小时前
深度优先遍历:JavaScript递归查找树形数据结构中的节点标签
前端·javascript·数据结构