【28 - 记住上一个页面tab】实现一个记住用户上次点击的tab,上次搜索过的数据 bysking

前端会话缓存管理:一个优雅的会话级别数据持久化解决方案

在现代 Web 应用开发中,我们经常需要在用户会话期间临时存储一些状态数据。今天给大家分享一个实用的会话缓存管理工具类 ------ TempWindowStore,它能帮助我们更好地管理 sessionStorage 中的数据。

🎯 核心功能

这个工具类主要实现了以下功能:

  1. 基于用户身份的数据隔离
  2. 结构化的缓存数据管理
  3. 自动化的数据清理机制
  4. 异常安全的数据操作

🔧 核心方法解析

1. 数据获取 - getFlagData

ini 复制代码
typescript
getFlagData = (flag) => {
  let key = this.getDataKey(flag);
  let resData = {};

  try {
    resData = JSON.parse(sessionStorage.getItem(key)!);
  } catch (error) {
    console.log(error, 'error: session cache data get');
  }

  return resData;
};

亮点

  • ✅ 自动拼接用户 Token,确保数据隔离
  • ✅ 异常捕获,避免 JSON 解析错误导致页面崩溃
  • ✅ 默认返回空对象,保证数据结构一致性

2. 数据存储 - setFlagData

typescript 复制代码
typescript
setFlagData = (flag: string, data = {}) => {
  this.clearFlagData(flag);         // 先清理旧数据
  
  let key = this.getDataKey(flag);  // 生成键名
  this.flagList.push(key);          // 记录键名

  const preData = this.getFlagData(flag) || {};  // 获取原有数据
  const curdata = {                 // 合并新旧数据
    ...preData,
    ...data,
  };

  try {
    sessionStorage.setItem(key, JSON.stringify(curdata));
  } catch (error) {
    console.log(error, 'error: session cache data set');
  }
};

设计亮点

  • 🔄 数据合并策略:保留原有数据,只更新新增字段
  • 🧹 自动清理:避免重复数据堆积
  • 🛡️ 异常处理:保障存储过程的稳定性

3. 数据清理 - clearFlagData

ini 复制代码
typescript
clearFlagData = (flag: string) => {
  const keys = Object.keys(sessionStorage);
  keys.forEach((key) => {
    if (key.startsWith(flag)) {
      sessionStorage.removeItem(key);
    }
  });
};

巧妙之处

  • 🔍 前缀匹配清理,精准定位相关数据
  • 🧹 批量清理,避免数据残留

🎯 实际应用场景

php 复制代码
typescript
// 定义缓存标识
export enum enumFlag {
  followUpTab = 'followUpTab',  // 随访标签页记忆
}

// 使用示例
tempWindowStore.setFlagData(enumFlag.followUpTab, {
  activeKey: '1',
  scrollTop: 500
});

// 获取数据
const tabData = tempWindowStore.getFlagData(enumFlag.followUpTab);

💡 设计优势

  1. 用户隔离:通过 Token 确保不同用户数据互不干扰
  2. 类型安全:配合枚举使用,避免硬编码字符串
  3. 内存友好:自动清理机制防止 sessionStorage 膨胀
  4. 开发友好:简洁的 API 设计,降低使用成本

🚀 最佳实践建议

php 复制代码
typescript
// 推荐用法
const cacheKey = enumFlag.followUpTab;
tempWindowStore.setFlagData(cacheKey, { 
  lastVisited: Date.now(),
  userPreferences: { theme: 'dark' }
});

// 数据获取时提供默认值
const userData = tempWindowStore.getFlagData(cacheKey) || {
  lastVisited: 0,
  userPreferences: { theme: 'light' }
};

📝 总结

TempWindowStore 通过封装 sessionStorage 操作,提供了一套完整的会话级数据管理方案。它不仅解决了数据隔离和异常处理等常见问题,还通过优雅的设计提升了开发体验。在需要临时存储用户状态的场景中,这个工具类能够大大提升开发效率和代码质量。

你觉得这个设计思路怎么样?在你的项目中有类似的缓存需求吗?欢迎在评论区交流讨论!

完整函数代码

js 复制代码
const getToken = () => {

        // get and return your user token
}


/** 用户数据缓存类 */
class TempWindowStore {
  flagList: string[] = [];
  userToken = getToken();

  getDataKey = (flag) => {
    return `${flag}_${this.userToken}`;
  };

  getFlagData = (flag) => {
    let key = this.getDataKey(flag);

    let resData = {};

    try {
      resData = JSON.parse(sessionStorage.getItem(key)!);
    } catch (error) {
      console.log(error, 'error: session cache data get');
    }

    return resData;
  };

  setFlagData = (flag: string, data = {}) => {
    this.clearFlagData(flag);

    let key = this.getDataKey(flag);
    this.flagList.push(key);

    const preData = this.getFlagData(flag) || {};

    const curdata = {
      ...preData,
      ...data,
    };

    try {
      sessionStorage.setItem(key, JSON.stringify(curdata));
    } catch (error) {
      console.log(error, 'error: session cache data set');
    }
  };

  clearFlagData = (flag: string) => {
    const keys = Object.keys(sessionStorage);
    keys.forEach((key) => {
      if (key.startsWith(flag)) {
        sessionStorage.removeItem(key);
      }
    });
  };
}

export enum enumFlag {
  pageFlag = 'pageFlag',
}

/** 用户缓存数据实例,比如记住上一次点击的数据 */
export const tempWindowStore = new TempWindowStore();

使用示范

js 复制代码
// 在合适的位置记住数据
  useEffect(() => {
    // 数据变化存入缓存
    if (activeKey) {
      tempWindowStore.setFlagData(enumFlag.pageFlag, {
        activeKey: activeKey,
        keyword,
      });
    }
  }, [activeKey, keyword]);
  
  
  
  
  // 页面初始化,取出来之前缓存的数据,设置成默认值
  let preTab = tempWindowStore.getFlagData(enumFlag.pageFlag)?.activeKey;
  let preKeyword = tempWindowStore.getFlagData(enumFlag.pageFlag)?.preKeyword;
      

有帮助点个赞

相关推荐
前端老石人2 分钟前
前端开发中的 URL 完全指南
开发语言·前端·javascript·css·html
CAE虚拟与现实2 分钟前
五一假期闲来无事,来个前段、后端的说明吧
前端·后端·vtk·three.js·前后端
Sarvartha13 分钟前
三目运算符
linux·服务器·前端
晓晨的博客20 分钟前
ROS1录制的bag包转换为ROS2格式
前端·chrome
Wect28 分钟前
LeetCode 72. 编辑距离:动态规划经典题解
前端·算法·typescript
donecoding41 分钟前
别再让 pnpm 跟着 nvm 跑了!独立安装终极指南
前端·node.js·前端工程化
不可能的是42 分钟前
从 /simplify 指令深挖 Claude Code 多 Agent 协同机制
javascript
GISer_Jing43 分钟前
AI全栈转型_TS后端学习路线
前端·人工智能·后端·学习
竹林81843 分钟前
被The Graph的GraphQL查询坑了三天,我用一个真实DeFi项目把链上数据索引彻底搞懂了
前端·graphql
漫游的渔夫43 分钟前
前端开发者做 Agent:别只会执行,用 4 类失败策略让 AI 知道怎么停
前端·人工智能·typescript