Vue中 引入使用 localforage 改进本地离线存储(突破5M限制)

简介: Vue中 引入使用 localforage 改进本地离线存储(突破5M限制)

1. 简介

说到本地存储数据,首先想到的是 localStorage,应该很多小伙伴都用过,使用很简单。然而,localStorage 却有下面一些缺点:

  • 存储容量限制,大部分浏览器应该最多5M。我就遇到过localStorage存储字符然后尺寸爆掉的情况;
  • 仅支持字符串,如果是存对象还需将使用 JSON.stringify 和 JSON.parse 方法互相转换,有些啰嗦;
  • 读取都是同步的。大多数情况下,还挺好使的。如果存储数据比较大,如一张重要图片base64格式存储了,再读可能会有可感知的延迟时间;

localforage 的作用就是用来规避上面 localStorage 的缺点,同时保留 localStorage 的优点而设计的。

localForage 是一个 JavaScript 库,通过简单类似 localStorage API 的 异步存储 来改进你的 Web 应用程序的离线体验。

它能存储多种类型的数据,而不仅是字符串(包括:Array、ArrayBuffer、Blob、Float32Array、Float64Array、Int8Array、Int16Array、Int32Array、Number、Object、Uint8Array、Uint8ClampedArray、Uint16Array、Uint32Array、String)。

localForage 有一个优雅降级策略,若浏览器不支持 IndexedDB 或 WebSQL,则使用 localStorage。在所有主流浏览器中都可用:Chrome,Firefox,IE 和 Safari(包括 Safari Mobile)。

localForage 提供回调 API 同时也支持 ES6 Promises API,可以自行选择。

传送门:localForage 中文文档

2. 使用方法

安装

npm i localforage

localforage npm 地址

引入

// main.js
import localForage from 'localforage';
Vue.prototype.$forage = localForage;
<template>
  <div>
    <button @click="forageSetVal">forageSetVal</button>
    <button @click="forageGetVal">forageGetVal</button>
    <button @click="forageRemoveVal">forageRemoveVal</button>
    <ul>
      <li 
        v-for="item in userInfos" 
        :key="item.name">
        {{item.name}} | {{item.city}}
      </li>
    </ul>
  </div>
</template>
<script>
export default {
  data() {
    return {
      userInfos:[],
    };
  },
  methods:{
    // 保存数据
    forageSetVal(){
      const userList = [
        {
          name:'张三',
          city:'北京',
        },{
          name:'李四',
          city:'南京',
        },{
          name:'王五',
          city:'深圳',
        }
      ]
      /*
      * setItem(key, value, successCallback)
      * 将数据保存到离线仓库。
      */
      this.$forage.setItem('userList', userList).then((val) => {
        console.log('setItem',val)
      }).catch(err => {
        console.log(err)
      })
    },
    // 获取数据
    forageGetVal(){
      /*
      * getItem(key, successCallback)
      * 从仓库中获取 key 对应的值并将结果提供给回调函数。如果 key 不存在,getItem() 将返回 null。
      * 当存储 undefined 时, getItem() 也会返回 null。由于 localStorage 限制,同时出于兼容性的原因 localForage 无法存储 undefined。
      */
      this.$forage.getItem('userList').then((val) => {
        console.log('getItem',val)
        this.userInfos = val;
      }).catch(err => {
        console.log(err)
      });
    },
    // 从离线仓库中删除 key 对应的值
    forageRemoveVal(){
      /*
      * removeItem(key, successCallback)
      * 从离线仓库中删除 key 对应的值。
      */
      this.$forage.removeItem('userList').then(() => {
        console.log('removeItem');
      }).catch(function(err) {
        console.log(err);
      });
    },
  },
};
</script>

先触发 forageSetVal 保存数据

1ecd1b2606ed46e9956a89f231c9802c.png

再触发 forageGetVal 获取数据

1ecd1b2606ed46e9956a89f231c9802c.png

最后触发 forageRemoveVal 删除数据

1ecd1b2606ed46e9956a89f231c9802c.png

3. localforage 和 indexDB 的区别

indexDB 为本地数据库存储,其功能非常强大,再复杂的结构存储都不在话下。localStorage 只是使用了其功能中的一部分,很多功能受限,如:localStorage 一次只能存一个字段。

indexDB几乎空间无限,性能也不错,各种数据结构都支持,为何总感觉在业内不温不火呢?

很重要的原因之一就是上手成本,包括2方面:

  • 前端需要了解数据库的一些基本概念,如:表,游标,事务,锁等。而业界普遍的前端都是与页面打交道的,数据库操作属于后端的后端了,离的有些远,于是,很多前端都不了解,需要从零开始的数据库学习;
  • indexedDB 的 API 又多又长又纷杂,学习成本高,容易记不住,网上好的资源少;

localforage 的出现可谓曲线救国,通常我们的数据存储并不需要特别复杂,只要不是完完全全的离线开发,localforage 足矣。既不浪费 indexDB 的好,又避开了 indexDB 高上手成本的坑。从这个角度看,indexDB 应该要谢谢 localforage。

    当然,如果存储的数据是负责的多行多列表结构,还是老老实实花点功夫学习学习 indexDB 的使用。


    相关文章
    |
    3月前
    |
    JavaScript
    Vue中如何实现兄弟组件之间的通信
    在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
    341 2
    |
    2月前
    |
    缓存 JavaScript
    vue中的keep-alive问题(2)
    vue中的keep-alive问题(2)
    318 137
    |
    6月前
    |
    人工智能 JavaScript 算法
    Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
    Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
    824 0
    |
    6月前
    |
    JavaScript UED
    用组件懒加载优化Vue应用性能
    用组件懒加载优化Vue应用性能
    |
    5月前
    |
    人工智能 JSON JavaScript
    VTJ.PRO 首发 MasterGo 设计智能识别引擎,秒级生成 Vue 代码
    VTJ.PRO发布「AI MasterGo设计稿识别引擎」,成为全球首个支持解析MasterGo原生JSON文件并自动生成Vue组件的AI工具。通过双引擎架构,实现设计到代码全流程自动化,效率提升300%,助力企业降本增效,引领“设计即生产”新时代。
    453 1
    |
    5月前
    |
    JavaScript 安全
    在 Vue 中,如何在回调函数中正确使用 this?
    在 Vue 中,如何在回调函数中正确使用 this?
    283 0
    |
    6月前
    |
    JavaScript 前端开发 开发者
    Vue 自定义进度条组件封装及使用方法详解
    这是一篇关于自定义进度条组件的使用指南和开发文档。文章详细介绍了如何在Vue项目中引入、注册并使用该组件,包括基础与高级示例。组件支持分段配置(如颜色、文本)、动画效果及超出进度提示等功能。同时提供了完整的代码实现,支持全局注册,并提出了优化建议,如主题支持、响应式设计等,帮助开发者更灵活地集成和定制进度条组件。资源链接已提供,适合前端开发者参考学习。
    493 17
    |
    6月前
    |
    JavaScript 前端开发 UED
    Vue 表情包输入组件实现代码及详细开发流程解析
    这是一篇关于 Vue 表情包输入组件的使用方法与封装指南的文章。通过安装依赖、全局注册和局部使用,可以快速集成表情包功能到 Vue 项目中。文章还详细介绍了组件的封装实现、高级配置(如自定义表情列表、主题定制、动画效果和懒加载)以及完整集成示例。开发者可根据需求扩展功能,例如 GIF 搜索或自定义表情上传,提升用户体验。资源链接提供进一步学习材料。
    304 1
    |
    6月前
    |
    存储 JavaScript 前端开发
    如何高效实现 vue 文件批量下载及相关操作技巧
    在Vue项目中,实现文件批量下载是常见需求。例如文档管理系统或图片库应用中,用户可能需要一次性下载多个文件。本文介绍了三种技术方案:1) 使用`file-saver`和`jszip`插件在前端打包文件为ZIP并下载;2) 借助后端接口完成文件压缩与传输;3) 使用`StreamSaver`解决大文件下载问题。同时,通过在线教育平台的实例详细说明了前后端的具体实现步骤,帮助开发者根据项目需求选择合适方案。
    569 0
    |
    6月前
    |
    JavaScript 前端开发 UED
    Vue 项目中如何自定义实用的进度条组件
    本文介绍了如何使用Vue.js创建一个灵活多样的自定义进度条组件。该组件可接受进度段数据数组作为输入,动态渲染进度段,支持动画效果和内容展示。当进度超出总长时,超出部分将以红色填充。文章详细描述了组件的设计目标、实现步骤(包括props定义、宽度计算、模板渲染、动画处理及超出部分的显示),并提供了使用示例。通过此组件,开发者可根据项目需求灵活展示进度情况,优化用户体验。资源地址:[https://pan.quark.cn/s/35324205c62b](https://pan.quark.cn/s/35324205c62b)。
    288 0

    热门文章

    最新文章