• localStorage容量太小?使用localforage进行大容量的存储


    localStorage是前端存储数据的一种方式,,但是其容量一般在5M-10M左右,用来缓存一些间的数据基本够用,但毕竟定位也不是大数据量的存储

    浏览器其实有提供大数据量的本地存储的,比如: IndexedDB,IndexDB存储数据大小一般在250M以上,弥补了localStorage容量的缺陷,我们可以通过localforage来进行大数据量的本地存储,使用起来也很方便,其中的API和localStorage基本类似,几乎没有学习成本

    1. 简述 

    npm官方:https://www.npmjs.com/package/localforage 

    localforage中文文档:https://localforage.docschina.org/#api-config 

    localforage 拥有类似 localStorage API,使用也很方便,几乎没有学习成本,它能存储多种类型的数据如 Array、 ArrayBuffer、 Blob、 Number、 Object、 String,而不仅仅是字符串。

    这意味着我们可以直接存 对象、数组类型的数据避免了 JSON.stringify 转换数据的一些问题。

    存储其他数据类型时需要转换成上边对应的类型,比如vue3中使用 reactive 定义的数据需要使用toRaw 转换成原始数据进行保存, ref 则直接保存 xxx.value 数据即可。

    2. 安装 

    1. npm i localforage
    2. or
    3. pnpm add localforage

    3. 使用 

    提供了与 localStorage 相同的api,不同的是它是异步的调用返回一个 Promise 对象 

    可以按需引入,也可以引入之后挂载到全局使用 

    import localforage from 'localforage'

    ① 存储数据 

     方式一:异步调用返回Promise(then)

    1. localforage.setItem(key, value).then(val => {
    2. console.log(val, '存储成功')
    3. }).catch(e => {
    4. console.error(e, '出错')
    5. })

    方式二:回调版本

    1. localforage.setItem(key, value, (err, val) => {
    2. if(!err) {
    3. console.log(val, '存储成功')
    4. } else {
    5. console.log(err, '出错')
    6. }
    7. })

    方式三:可以使用 async/await 的方式

    1. try {
    2. let val = await localforage.setItem(key, value)
    3. } catch(e) {
    4. console.log(e, '出错')
    5. }

    ② 获取数据 

     同样的也是和上面方式差不多,将setItem 换成 getItem就可以了

    1. // 根据数据的 key 获取数据 没有则返回 null
    2. localforage.getItem(key).then(value => {
    3. // 当离线仓库中的值被载入时,此处代码运行
    4. obj.value = value // value就是取出来的值
    5. }).catch(err => {
    6. console.error(err, '取值出错')
    7. })
    8. // 回调版本:
    9. localforage.getItem(key, (err, value) => {
    10. // 当离线仓库中的值被载入时,此处代码运行
    11. if(!err) {
    12. obj.value = value // value就是取出来的值
    13. }
    14. })

    ③ 删除数据 

     也是同样的

    1. localforage.removeItem('obj').then(() => {
    2. console.log('删除成功');
    3. }).catch(err => {
    4. console.error(err, '删除失败')
    5. })
    6. // 回调版本:
    7. localforage.removeItem('obj', (err) => {
    8. if(!err) {
    9. console.log('删除成功')
    10. } else {
    11. console.error(err, '删除失败')
    12. }
    13. })

    ④  其他方法

    • length 获取key的数量
    • key 根据key的索引获取其名
    • keys 获取数据仓库中所有的key
    • iterate 迭代数据仓库中的所有的 value/key 键值对

    4. 配置 

    localforage.config({ name: 'My-localStorage' }); 设置仓库的名字,不同的名字代表不同的仓库,当一个应用需要多个本地仓库隔离数据的时候就很有用。 

    1. const store = localforage.createInstance({
    2. name: "nameHere"
    3. });
    4. const otherStore = localforage.createInstance({
    5. name: "otherName"
    6. });
    7. // 设置某个数据仓库 key 的值不会影响到另一个数据仓库
    8. store.setItem("key", "value");
    9. otherStore.setItem("key", "value2");

    同时也支持删除仓库 

    1. // 调用时,若不传参,将删除当前实例的 “数据仓库” 。
    2. localforage.dropInstance().then(function() {
    3. console.log('Dropped the store of the current instance').
    4. });
    5. // 调用时,若参数为一个指定了 name 和 storeName 属性的对象,会删除指定的 “数据仓库”。
    6. localforage.dropInstance({
    7. name: "otherName",
    8. storeName: "otherStore"
    9. }).then(function() {
    10. console.log('Dropped otherStore').
    11. });
    12. // 调用时,若参数为一个仅指定了 name 属性的对象,将删除指定的 “数据库”(及其所有数据仓库)。
    13. localforage.dropInstance({
    14. name: "otherName"
    15. }).then(function() {
    16. console.log('Dropped otherName database').
    17. });

    除了本文介绍的localforage外还有idb-keyval(idb-keyval是用IndexedDB实现的一个超级简单的基于 promise 的键值存储。)等库也是可以的

    但是我更喜欢本文的 localforage 毕竟学习成本更低一些,跟localStorage中的API 很是类似。

     学习于:https://juejin.cn/post/7163075131261059086

  • 相关阅读:
    斐波那契数列,剑指offer,力扣
    Unity 截取3D图像 与 画中画PIP的实现
    springboot个性化课程推荐系统毕业设计源码131805
    多线程开发中,多用消息传递,少用锁
    BIM → CIM,捷码赋能智慧城市多行业应用开发
    1992-2021年省市县经过矫正的夜间灯光数据(GNLD、VIIRS)
    互联网公司都怎么实现分页的,拿 MySQL 使劲Limit?
    新巨丰深交所上市:市值82亿 伊利是股东,贡献70%收入
    DevSeo Studio设置中文界面
    【电压质量】提高隔离电源系统的电压质量(Simulink实现)
  • 原文地址:https://blog.csdn.net/m0_51431448/article/details/127872949