写点什么

如何在`created`生命周期钩子中使用`sessionStorage`实现缓存

作者:Chihiro
  • 2025-02-14
    上海
  • 本文字数:1403 字

    阅读完需:约 5 分钟

在 Vue.js 的 created 生命周期钩子中使用 sessionStorage 实现缓存,主要思路是在获取数据前先检查 sessionStorage 中是否已经存在所需数据,如果存在则直接使用缓存数据,若不存在则发起请求获取数据并将其存入 sessionStorage 中。以下是一个完整的示例,展示了如何在 created 钩子中实现这一功能:

<template>  <div>    <ul>      <!-- 遍历展示列表数据 -->      <li v-for="item in cachedList" :key="item.id">{{ item.name }}</li>    </ul>  </div></template>
<script>export default { data() { return { initParams: {}, queryParams: { upCode: '' }, cachedList: [] // 用于存储列表数据,初始为空数组 }; }, created() { // 获取路由中的查询参数 let query = this.$route.query; this.initParams = query; this.queryParams.upCode = query.code;
// 生成缓存的键,使用 upCode 确保不同的 upCode 有不同的缓存 const cacheKey = `list_cache_${this.queryParams.upCode}`; // 从 sessionStorage 中尝试获取缓存数据 const cachedData = sessionStorage.getItem(cacheKey);
if (cachedData) { // 如果缓存存在,将其解析为 JavaScript 对象并赋值给 cachedList this.cachedList = JSON.parse(cachedData); console.log('使用缓存数据'); } else { // 如果缓存不存在,调用获取数据的方法并传入缓存键 this.getList(cacheKey); } }, methods: { getList(cacheKey) { // 模拟一个异步请求来获取数据,这里使用 setTimeout 模拟延迟 setTimeout(() => { // 模拟从服务器获取到的数据 const listData = [ { id: 1, name: '商品 1' }, { id: 2, name: '商品 2' }, { id: 3, name: '商品 3' } ]; // 将获取到的数据赋值给 cachedList this.cachedList = listData; // 将数据存入 sessionStorage 中,需要将对象转换为 JSON 字符串 sessionStorage.setItem(cacheKey, JSON.stringify(listData)); console.log('数据已缓存'); }, 1000); } }};</script>
复制代码

代码解释

1.created 钩子部分

  • 首先从路由中获取查询参数,并将其存储到 initParams 和 queryParams 中。

  • 生成一个基于 upCode 的唯一缓存键 cacheKey,用于在 sessionStorage 中存储和查找数据。

  • 尝试从 sessionStorage 中获取该缓存键对应的数据。

  • 如果存在缓存数据,将其解析为 JavaScript 对象并赋值给 cachedList,表示使用缓存数据。

  • 如果不存在缓存数据,则调用 getList 方法去获取新的数据。

2.getList 方法部分

  • 使用 setTimeout 模拟一个异步请求,实际应用中可以替换为真实的 API 请求。

  • 模拟获取到数据后,将其赋值给 cachedList 并显示在页面上。

  • 将获取到的数据转换为 JSON 字符串后存入 sessionStorage 中,以便下次使用。

注意事项

  • sessionStorage 存储的数据类型只能是字符串,因此在存储对象时需要使用 JSON.stringify() 进行转换,读取时使用 JSON.parse() 还原。

  • sessionStorage 中的数据在会话结束(关闭浏览器窗口)时会被清除。

  • 在实际项目中,你需要将 setTimeout 替换为真实的 API 请求,例如使用 axios 库来发起请求。

用户头像

Chihiro

关注

还未添加个人签名 2025-02-06 加入

还未添加个人简介

评论

发布
暂无评论
如何在`created`生命周期钩子中使用`sessionStorage`实现缓存_缓存_Chihiro_InfoQ写作社区