当前位置: 首页 > news >正文

vue使用indexedDB缓存教程

1.前端缓存几种方式: cookie、localStorage、sessionStorage、indexedDB,下面详细介绍indexedDB

2.完整代码

class DBManager {dbName: any = null;version: any = null;db: any = null;/*** 初始化数据库名、版本* @param dbName* @param version*/constructor(dbName: String, version: String | Number) {this.dbName = dbName;this.version = version;this.db = null;}/*** 打开数据库* @param callback* @returns*/openDB(storeName?: String, keyPath?: String, keys?: Array<any>) {return new Promise((resolve, reject) => {if (this.db) {resolve(this.db);} else {const cmd = indexedDB.open(this.dbName, this.version);cmd.onsuccess = (e: any) => {this.db = e.target.result;resolve(this.db);};cmd.onerror = (e: any) => {reject(e.target.error);};cmd.onupgradeneeded = (e: any) => {this.db = e.target.result;this.createStore(storeName, keyPath, keys);};}});}/*** 关闭数据库*/closeDB() {if (this.db) {this.db.close();this.db = null;}}/*** 删除数据库* @returns*/deleteDB() {return new Promise((resolve, reject) => {this.closeDB();const cmd = indexedDB.deleteDatabase(this.dbName);cmd.onsuccess = (e: any) => {resolve("");};cmd.onerror = (e: any) => {reject(e.target.error);};});}/*** 创建对象仓库* @param storeName* @param keyPath* @param keys* @returns*/createStore(storeName?: String, keyPath?: String, keys?: Array<any>) {return new Promise(async (resolve, reject) => {if (this.db) {const store = this.db.createObjectStore(storeName, {keyPath: keyPath,autoIncrement: true,});if (keys) {keys.forEach((key: any) => {store.createIndex(key, key, { unique: key === keyPath ? true : false });});}resolve(this.db);} else {reject("数据库未打开createStore");}});}/*** 增加数据* @param storeName* @param data* @returns*/insert(storeName: String, data: any) {return new Promise((resolve, reject) => {if (this.db) {const transaction = this.db.transaction(storeName, "readwrite");const store = transaction.objectStore(storeName);const cmd = store.add(data);cmd.onsuccess = (e: any) => {resolve(e.target.result);};cmd.onerror = (e: any) => {reject(e.target.error);};} else {reject("数据库未打开");}});}/*** 查询数据,默认根据主键查询* @param storeName* @param value* @returns*/queryByKey(storeName: String, value: any) {return new Promise((resolve, reject) => {if (this.db) {const transaction = this.db.transaction(storeName, "readonly");const store = transaction.objectStore(storeName);const cmd = store.get(value);cmd.onsuccess = (e: any) => {resolve(e.target.result);};cmd.onerror = (e: any) => {reject(e.target.error);};} else {reject("数据库未打开");}});}/*** 查询全部数据记录* @param storeName* @returns*/queryAll(storeName: String) {return new Promise((resolve, reject) => {if (this.db) {const transaction = this.db.transaction(storeName, "readonly");const store = transaction.objectStore(storeName);const cmd = store.getAll();cmd.onsuccess = (e: any) => {resolve(e.target.result);};cmd.onerror = (e: any) => {reject(e.target.error);};} else {reject("数据库未打开");}});}/*** 通过游标查询,跟queryByIndex的区别是:游标查询可定义查询条件,比如年龄在18-24之间的数据* @param storeName* @param range 查询条件* @param direction 排序顺序* @returns*/queryByCursor(storeName: String, key?: String, range?: any, direction: String = "next") {return new Promise((resolve, reject) => {if (this.db) {const transaction = this.db.transaction(storeName, "readonly");const store = transaction.objectStore(storeName);const index = key ? store.index(key) : "";const cursor = range ? index.openCursor(range, direction) : store.openCursor();const result: Array<any> = [];cursor.onsuccess = (e: any) => {const cursor = e.target.result;if (cursor) {result.push(cursor.value);cursor.continue();}resolve(result);};cursor.onerror = (e: any) => {reject(e.target.error);};} else {reject("数据库未打开");}});}/*** 通过键值对查询* @param storeName* @param indexName* @param value* @returns 获取:键为indexName,值为value 的那条数据*/queryByIndex(storeName: String, indexName: String, value: any) {return new Promise((resolve, reject) => {if (this.db) {const transaction = this.db.transaction(storeName, "readonly");const store = transaction.objectStore(storeName);const cmd = store.index(indexName).get(value);cmd.onsuccess = (e: any) => {resolve(e.target.result);};cmd.onerror = (e: any) => {reject(e.target.error);};} else {reject("数据库未打开");}});}/*** 更新数据* @param storeName* @param key* @param data* @returns*/update(storeName: String, key: String, newData: any) {return new Promise((resolve, reject) => {if (this.db) {const transaction = this.db.transaction(storeName, "readwrite");const store = transaction.objectStore(storeName);const cmd = store.get(key);cmd.onsuccess = (e: any) => {let data = e.target.result;Object.assign(data, newData);const requestUpdate = store.put(data);requestUpdate.onsuccess = (e: any) => {resolve(e.target.result);};requestUpdate.onerror = (e: any) => {reject(e.target.error);};};cmd.onerror = (e: any) => {reject(e.target.error);};} else {reject("数据库未打开");}});}/*** 删除数据* @param storeName* @param key* @returns*/delete(storeName: String, key: String) {return new Promise((resolve, reject) => {if (this.db) {const transaction = this.db.transaction(storeName, "readwrite");const store = transaction.objectStore(storeName);const cmd = store.delete(key);cmd.onsuccess = (e: any) => {resolve(e.target.result);};cmd.onerror = (e: any) => {reject(e.target.error);};} else {reject("数据库未打开");}});}
}
export default DBManager;

3.在项目中使用

template:<button @click="learnDb('open')">打开</button><button @click="learnDb('add')">添加</button><button @click="learnDb('search')">查询</button><button @click="learnDb('delete')">删除</button><button @click="learnDb('update')">更新</button><button @click="learnDb('close')">关闭</button><button @click="learnDb('clearn')">清除</button>script://学习indexedDB
let myDB = new DBManager("zhengjie", 1);
let learnDb = async (type: String) => {if (type == "clearn") {myDB.deleteDB();} else if (type == "open") {myDB.openDB("users", "name", ["name", "age"]);} else if (type == "add") {myDB.insert("users", { name: "整洁", age: 18 });} else if (type == "search") {// let a = await myDB.queryByKey("users", "整洁");// let a = await myDB.queryAll("users");// const range = IDBKeyRange.only(24);// let a = await myDB.queryByCursor("users", "age", range); //查询名字(name)为整洁的数据let a = await myDB.queryByIndex("users", "age", 24);console.log("查找数据", a);} else if (type == "delete") {myDB.delete("users", "整洁");} else if (type == "update") {myDB.update("users", "整洁", { name: "整洁", age: 24 });} else if (type == "close") {myDB.closeDB();}
};

相关文章:

  • BCJR算法——卷积码的最大后验译码
  • Visual Studio代码编辑快捷键
  • 【Golang】关于Go语言数学计算、随机数生成模块--math
  • 损失函数篇 | YOLOv10 更换损失函数之 MPDIoU | 《2023 一种用于高效准确的边界框回归的损失函数》
  • 【数据结构】MapSet
  • Glide基本用法及With方法源码解析
  • Python保留数据删除Excel单元格的函数和公式
  • 通过PHP获取商品详情
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-30
  • 解锁高效开发的秘密武器
  • 无人机之编队控制篇
  • 【无人机设计与控制】Multi-UAV|多无人机多场景路径规划算法MATLAB
  • Spring Cloud全解析:服务调用之OpenFeign集成OkHttp
  • 【C++算法】8.双指针_三数之和
  • 初识Linux · O(1)调度算法
  • $translatePartialLoader加载失败及解决方式
  • 「译」Node.js Streams 基础
  • 【Amaple教程】5. 插件
  • Git 使用集
  • isset在php5.6-和php7.0+的一些差异
  • Java编程基础24——递归练习
  • Java到底能干嘛?
  • Java基本数据类型之Number
  • Java应用性能调优
  • JAVA之继承和多态
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Python - 闭包Closure
  • React中的“虫洞”——Context
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • 闭包,sync使用细节
  • 从tcpdump抓包看TCP/IP协议
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 如何优雅地使用 Sublime Text
  • 手写一个CommonJS打包工具(一)
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 用jQuery怎么做到前后端分离
  • 原生js练习题---第五课
  • 交换综合实验一
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • ‌U盘闪一下就没了?‌如何有效恢复数据
  • #NOIP 2014#Day.2 T3 解方程
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (152)时序收敛--->(02)时序收敛二
  • (C)一些题4
  • (day6) 319. 灯泡开关
  • (k8s)Kubernetes本地存储接入
  • (二)Kafka离线安装 - Zookeeper下载及安装
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)php投票系统 毕业设计 121500
  • (计算机网络)物理层
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (转)socket Aio demo