window.indexDB & window.localForage的使用

什么是LocalForage?

LocalForage是一个简单易用的JS库。它提供了一种跨浏览器的方式来进行本地数据存储。是基于IndexDB,WebSQL和localStorage 等浏览器本地存储API的封装库,通过类似localStorage API的异步存储来改进Web应用程序的离线体验。

优势

  1. 异步存储可以处理大量存储业务,不会阻塞主要进程。
  2. 可存储多种数据类型,对比localStorage,cookies,seesion 来看存储类型不只字符串,LocalForage可以直接存储和检索JavaScript对象、数组等复杂数据类型。
  3. 跨浏览器支持,主流浏览器中Chrome,Firefox,IE 和 Safari(包括 Safari Mobile)都可使用,但不兼容的浏览LocalForage有优雅的降级兼容策略若浏览器不支持indexDB或WebSQL则使用localStorage
  4. 存储容量,在不降级使用localStorage 的情况下可以处理大量数据。
  5. 数据共享:localStorage的数据仅限于当前域名下页面。而LocalForage 可以通过配置共享数据,使不同域名页面可以访问和共享存储数据。

LocalForage 使用

  1. 引入localForage

1.1npm安装

npm install localforage

引入

import localforage from 'localforage';

1.2直接引入

<script src="https://cdn.jsdelivr.net/npm/localforage@latest/dist/localforage.js"></script>

  1. 初始化配置 以下过程以vue中项目为例
js 复制代码
localforage.config({
   // driver: localforage.INDEXEDDB,  选择存储引擎,如IndexedDB  不写则自动按IndexedDB>>WebSQL>>localStorage降序
     driver: [localforage.WEBSQL,
             localforage.INDEXEDDB,
             localforage.LOCALSTORAGE],
    name: 'my-app', // 数据库名称
    version: 1, // 数据库版本号 用于升级
    storeName: 'my-store', // 存储对象的名称
    size:'10000' //数据库大小(以字节为单位)只用于设置webSQL.默认值4980736
});

挂载localforage 到vue全局

Vue.prototype.$localforage = localforage 初始化配置后可在浏览器存储看见数据库已新建

  1. 存入数据

setItem (key,value,callback) 可传入一个成功回调

javascript 复制代码
this.$localforage.setItem('data', 222222222222222, () => {
            console.log('set 成功 执行其他逻辑')
        })
  1. 获取数据

由于indexedDB的存取都是异步的,存取数据可以使用 promise.then() 或 async/await 去读值

eg:

js 复制代码
async getVal(key) {
            let value = await this.$localforage.getItem(key)
            console.log(value, 'finish get dosomething')
        }
        
       或者
    async getVal(key) {
         this.$localforage.getItem(key).then(function (value) {
console.log(value, 'finish get dosomething')
}).catch(function (err) {
  // we got an error
});
        }
  1. 删除数据
js 复制代码
removeKey(key) {
           this.$localforage.removeItem(key).then(() => {
    console.log('Data removed successfully');
  })
  .catch((error) => {
    console.error('Error removing data:', error);
  });

        },

4.清空数据库

js 复制代码
clearStore() {
           this.$localforage
                .clear()
                .then(() => {
                    console.log('All data cleared')
                })
                .catch((error) => {
                    console.error('Error clearing data:', error)
                })
        }

什么是IndexDB?

indexDB 是一个运行在浏览器的非关系型数据库

特点

  1. 键值对存储:indexDB内部采用对象仓库存放数据。所有类型的数据可以直接存入,在仓库里数据以键值对的形式进行保存,每个数据记录丢有对应的主键且主键独一无二。
  2. indexDB操作是异步操作,不会因同步任务较多锁死浏览器;用户操作indexDB时可进行其他操作,避免了大量读写操作时影响网页性能。
  3. 支持事务 :indexDB支持在数据库操作失败后,事务取消数据库可回滚到之前的状态
  4. 同源限制 indexDB受同源限制,每个数据库对应创建它的域名。网页只能访问自身域名下的数据库不能跨域访问。
  5. 支持二进制存储:indexDB不仅可以存储字符串也可以存储二进制树
  6. 存储空间大,indexDB为数据库,大小不小于250M.

使用(以在vue组件中使用为例)

  1. 初始化
js 复制代码
data() {
        return {
            db: null,
        }
    },
js 复制代码
initDB() {
            let that = this
            // 创建数据库 名称
            var request = window.indexedDB.open('databaseName')
            request.onerror = function (event) {
                // 错误处理
                console.log(' 打开数据库报错')
            }
            request.onsuccess = function (event) {
                // 成功处理
                that.db = event.target.result
                console.log('打开数据库成功')
            }
            // 更新监听    默认在初始化的时候调用  表已存在则更新,不存在则新建表格
            request.onupgradeneeded = function (event) {
                that.db = event.target.result
                var objectStore = null
                
                if (!that.db.objectStoreNames.contains('tableName')) {
                    objectStore = that.db.createObjectStore('tableName', { keyPath: 'id' })
                    // 创建索引 可以让你搜索任意字段  别名 》》属性名
                    objectStore.createIndex('name111', 'name', { unique: false })
        },

indexDB各方法为异步方法,可执行其他回调事件

  1. 存入数据
js 复制代码
add (data, tableName) => {
    const request = db.transaction([tableName], 'readwrite').objectStore(tableName).add(data);
    return new Promise((resolve, reject) => {
        request.onsuccess = function (event) {
            console.log('数据写入成功');
            resolve(event);
        };
        request.onerror = function (event) {
            console.log('数据写入失败');
            reject(event);
        }
    })
}
  1. 查询数据
js 复制代码
  // 查
        read(tableName, keyName) {
            // 取到数据表
            var objectStore = this.db.transaction([tableName]).transaction.objectStore(tableName)
            // 用户读取数据,参数是主键
            var request = objectStore.get(keyName)
             return new Promise((resolve, reject) => {
            request.onerror = function (event) {
                reject(event);
            }
            request.onsuccess = function (event) {
             resolve(request.result);
                
            }
             })
        },
  1. 数据更新
js 复制代码
const update = (data, tableName ) => {
    const request = db.transaction([tableName], 'readwrite')
        .objectStore(tableName)
        .put(data);

    return new Promise((resolve, reject) => {
        request.onsuccess = function (event) {
            console.log('数据更新成功');
            resolve(event);
        };
        request.onerror = function (event) {
            console.log('数据更新失败');
            reject(event);
        }
    })
}
  1. 数据删除
js 复制代码
const remove = (keyName , tableName ) => {
    const request = db.transaction([tableName], 'readwrite')
        .objectStore(tableName)
        .delete(keyName);

    return new Promise((resolve, reject) => {
        request.onsuccess = function (event) {
            console.log('数据删除成功');
            resolve(true);
        };
        request.onerror = function (event) {
            console.log('数据删除失败');
            reject(event)
        };

    })

}
  1. 查询数据使用索引
js 复制代码
 // 使用索引索引的意义在于,可以让你搜索任意字段,也就是说从任意字段拿到数据记录。如果不建立索引,默认只能搜索主键(即从主键取值)。假定新建表格的时候,对name字段建立了索引。
        // 用索引的别名当参数
        // 查询到第一个后返回
        getDataByIndex(tableName, aliasName, parmaVal) {
            var store = this.db.transaction([tableName], 'readwrite').objectStore(tableName)
            // 以某个值为索引 并创建查询事务
            var index = store.index(aliasName)
            var request = index.get(parmaVal)
               return new Promise((resolve, reject) => {
        request.onsuccess = function (event) {
         var result = event.target.result
            resolve(result);
        };
        request.onerror = function (event) {
            reject(event)
        };

    })

        },
相关推荐
少云清几秒前
【功能测试】6_Web端抓包 _Fiddler抓包工具的应用
前端·功能测试·fiddler
豐儀麟阁贵9 分钟前
8.5在方法中抛出异常
java·开发语言·前端·算法
zengyuhan50339 分钟前
Windows BLE 开发指南(Rust windows-rs)
前端·rust
醉方休42 分钟前
Webpack loader 的执行机制
前端·webpack·rust
前端老宋Running1 小时前
一次从“卡顿地狱”到“丝般顺滑”的 React 搜索优化实战
前端·react.js·掘金日报
隔壁的大叔1 小时前
如何自己构建一个Markdown增量渲染器
前端·javascript
用户4445543654261 小时前
Android的自定义View
前端
WILLF1 小时前
HTML iframe 标签
前端·javascript
枫,为落叶1 小时前
Axios使用教程(一)
前端
小章鱼学前端1 小时前
2025 年最新 Fabric.js 实战:一个完整可上线的图片选区标注组件(含全部源码).
前端·vue.js