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();}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/55102.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在C#中使用JSON

JSON简介 1. 什么是 JSON&#xff1f; JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式。它的语法基于 JavaScript 对象表示法&#xff0c;简单、易读&#xff0c;同时被许多编程语言支持。尽管它来源于 JavaScript&#xff0c;但它并不依…

RTE大会报名丨 重塑语音交互:音频技术和 Voice AI,RTE2024 技术专场第一弹!

Voice AI 实现 human-like 的最后一步是什么&#xff1f; AI 视频爆炸增长&#xff0c;新一代编解码技术将面临何种挑战&#xff1f; 当大模型进化到实时多模态&#xff0c;又将诞生什么样的新场景和玩法&#xff1f; 所有 AI Infra 都在探寻规格和性能的最佳平衡&#xff0…

美畅物联丨GB/T 28181系列之TCP/UDP被动模式和TCP主动模式

GB/T 28181《安全防范视频监控联网系统信息传输、交换、控制技术要求》作为我国安防领域的重要标准&#xff0c;为视频监控系统的建设提供了全面的技术指导和规范。该标准详细规定了视频监控系统的信息传输、交换和控制技术要求&#xff0c;在视频流传输方面&#xff0c;GB/T 2…

大厂面试真题:简单说下Redis的bigkey

什么是bigkey bigkey是指key对应的value所占的内存空间比较大&#xff0c;例如一个字符串类型的value可以最大存到512MB&#xff0c;一个列表类型的value最多可以存储23-1个元素。 如果按照数据结构来细分的话&#xff0c;一般分为字符串类型bigkey和非字符串类型bigkey。 字…

考研数据结构——C语言实现插入排序

插入排序是一种简单直观的比较排序算法&#xff0c;它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。插入排序在实现上&#xff0c;通常采用in-place&#xff08;原地排序&#xff09;&#…

ceph rgw 桶分片之reshard

Ceph RGW&#xff08;RADOS Gateway&#xff09;的 reshard 功能是用来动态调整对象存储的分片&#xff08;shard&#xff09;数量&#xff0c;从而优化性能和存储利用率。随着数据量的增加&#xff0c;初始的分片设置可能无法满足性能需求&#xff0c;因此 reshard 功能允许用…

Git 与远程分支

90.远程仓库和分支 我们经常需要对远程仓库里的分支进行更新。 ‍ 当从远程库 clone 时&#xff0c;默认情况下&#xff0c;只会拉取 master ​分支&#xff0c;并且会将本地的 master 分支和远程的 master 分支关联起来&#xff1a; $ git branch * master‍ ‍ 推送本地…

17.第二阶段x86游戏实战2-线程发包和明文包

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

kubernetes的网络

kubernetes网络模型 Kubernetes采用的是基于扁平地址空间的网络模型&#xff0c;集群中的每个Pod都有自己的IP地址&#xff0c;Pod之间不需要配置NAT就能直接通信&#xff0c;同一个Pod中的容器共享Pod的IP&#xff0c;能够通过localhost通信Pod容器内的通信 当Pod被调度到某个…

车辆重识别(去噪扩散概率模型)论文阅读2024/9/27

[2] Denoising Diffusion Probabilistic Models 作者&#xff1a;Jonathan Ho Ajay Jain Pieter Abbeel 单位&#xff1a;加州大学伯克利分校 摘要&#xff1a; 我们提出了高质量的图像合成结果使用扩散概率模型&#xff0c;一类潜变量模型从非平衡热力学的考虑启发。我们的最…

【hot100-java】【零钱兑换】

R9-dp篇 class Solution {public int coinChange(int[] coins, int amount) {int ncoins.length;int [][] fnew int[n1][amount1];//除2防止下面1溢出Arrays.fill(f[0],Integer.MAX_VALUE/2);f[0][0]0;for (int i0;i<n;i){for (int c0;c<amount;c){if(c<coins[i]) f[i…

5G NR 协议规范表(对应3GPP 协议编号)

文章目录 5G NR 协议规范表&#xff08;对应3GPP 协议编号&#xff09;5G 架构相关协议5G 新空口相关协议无线接入网相关协议终端相关协议 5G NR 协议规范表&#xff08;对应3GPP 协议编号&#xff09; 5G 架构相关协议 5G 新空口相关协议 无线接入网相关协议 终端相关协议

网页设计html心得

一&#xff0c;认识网页 说到网页&#xff0c;其实大家并不陌生 1.1网页究竟是什么&#xff1f; 网页主要由文字、图像和超链接等元素构成。当然&#xff0c;除了这些元素&#xff0c;网页中还可以包含音频、视频以及Flash等。 1.2网页是如何形成的呢&#xff1f; 1.特殊的…

uni-app在线预览pdf

这里推荐下载pdf.js 插件 PDF.js - Browse Files at SourceForge.net 特此注意 如果报 Promise.withResolvers is not a function 请去查看版本兼容问题 降低pdf.js版本提高node版本 下载完成后 在 static 文件夹下新建 pdf 文件夹&#xff0c;将解压文件放进 pdf 文件…

监控和日志管理:深入了解Nagios、Zabbix和Prometheus

在现代IT运维中&#xff0c;监控和日志管理是确保系统稳定性和性能的关键环节。本文将介绍三种流行的监控工具&#xff1a;Nagios、Zabbix和Prometheus&#xff0c;帮助您了解它们的特点、使用场景以及如何进行基本配置。 一、Nagios Nagios 是一个强大的开源监控系统&#x…

从0新建一个微信小程序实现一个简单跳转

首先 1.从这里下载开发工具 https://developers.weixin.qq.com/miniprogram/dev/framework/quickstart/getstart.htm 2. 等下载完毕后 创建一个空白项目 在pages目录下右键创建一个page : testUI,这时候会生成四个文件 新建一个文件夹 testUI 给他们放一起 3.增加一个按钮 …

蛋白质结构中模型的提取

在 Biopython 的 PDB 模块中,提取 PDB 结构中的 model 信息相对直观。在 PyMMCIF 包中,我们可以通过提取 atom_site 数据中的 pdbx_PDB_model_num 字段来识别结构中的不同模型。下面是如何使用这两个包分别提取结构的 model 信息的示例代码。 1. Biopython PDB 模块提取模型…

尚品汇-自动化部署-Jenkins的安装与环境配置(五十六)

目录&#xff1a; 自动化持续集成 &#xff08;1&#xff09;环境准备 &#xff08;2&#xff09;初始化 Jenkins 插件和管理员用户 &#xff08;3&#xff09;工作流程 &#xff08;4&#xff09;配置 Jenkins 构建工具 自动化持续集成 互联网软件的开发和发布&#xf…

多线程事务管理:Spring Boot 实现全局事务回滚

多线程事务管理:Spring Boot 实现全局事务回滚 在日常开发中,我们常常会遇到需要在多线程环境下进行数据库操作的场景。这类操作的挑战在于如何保证多个线程中的数据库操作要么一起成功,要么一起失败,即 事务的原子性。尤其是在多个线程并发执行的情况下,确保事务的一致性…

门面(外观)模式

简介 门面模式&#xff08;Facade Pattern&#xff09;又叫作外观模式&#xff0c;提供了一个统一的接口&#xff0c;用来访问子系统中的一群接口。其主要特征是定义了一个高层接口&#xff0c;让子系统更容易使用&#xff0c;属于结构型设计模式。 通用模板 创建子系统角色类…