前端数据量超大时使用indexDB缓存

首先我们知道localstorage、sessionstorage和cookie存数据时都是有大小限制的,其次因为项目中使用的是pinia,经过测试后也无法缓存5M以上的数据。

那么当数据量很大时我们如何缓存呢?indexDB。

废话不多说,直接上代码:

export default class DB {
	dbName: string
	db: any
	constructor(name: string) {
		this.dbName = name
	}

	open(storeName: string, keyPath: string, indexs?: Array<string>) {
		if (!window.indexedDB) {
			return alert('您的浏览器不支持该app,为了更好的体验,请使用新版chrome浏览器')
		}
		const request = window.indexedDB.open(this.dbName, 1)
		return new Promise((resolve, rej) => {
			request.onerror = (e: any) => {
				this.onmessage({ type: '数据库连接失败', message: e })
				rej()
			}
			request.onsuccess = (e: any) => {
				this.db = e.target.result
				this.onmessage({ type: '数据库连接成功', message: '' })
				resolve()
			}
			request.onupgradeneeded = (e: any) => {
				const db = e.target.result
				if (!db.objectStoreNames.contains(storeName)) {
					const store = db.createObjectStore(storeName, { autoIncrement: true, keyPath })
					if (indexs && indexs.length) {
						indexs.map((v) => {
							store.createIndex(v, v, { unique: false })
						})
					}
					store.transaction.oncomplete = (ev: any) => {
						this.onmessage({ type: '创建对象仓库成功', message: '' })
					}
				}
			}
		})
	}

	onmessage(msg: MsgProps) {
		console.log(msg.type, msg.message)
	}

	update(storeName: string, data: object) {
		const store = this.db.transaction([storeName], 'readwrite').objectStore(storeName)
		return new Promise((resolve, rej) => {
			const request = store.put({
				...data,
				lastModify: new Date().getTime()
			})
			request.onsuccess = (e: any) => {
				this.onmessage({
					type: '更新成功',
					message: data
				})
				resolve()
			}
			request.onerror = (e: any) => {
				this.onmessage({
					type: '更新失败',
					message: data
				})
				rej()
			}
		})
	}

	add(storeName: string, data: object) {
		const store = this.db.transaction([storeName], 'readwrite').objectStore(storeName)
		return new Promise((resolve, rej) => {
			const request = store.add({
				...data,
				lastModify: new Date().getTime()
			})
			request.onsuccess = (e: any) => {
				this.onmessage({
					type: '添加成功',
					message: data
				})
				resolve()
			}
			request.onerror = (e: any) => {
				this.onmessage({
					type: '添加失败',
					message: data
				})
				rej()
			}
		})
	}

	getList(storeName: string) {
		const store = this.db.transaction([storeName]).objectStore(storeName)
		return new Promise((resolve, rej) => {
			store.getAll().onsuccess = (e: any) => {
				const res = e.target.result
				this.onmessage({
					type: '获取列表成功',
					message: res
				})
				resolve(res)
			}
		})
	}

	delete(storeName: string, key: string) {
		const store = this.db.transaction([storeName], 'readwrite').objectStore(storeName)
		const request = store.delete(key)
		return new Promise((resolve, rej) => {
			request.onsuccess = (e: any) => {
				this.onmessage({
					type: '删除成功',
					message: key
				})
				resolve()
			}
			request.onerror = (e: any) => {
				this.onmessage({
					type: '删除失败',
					message: data
				})
				rej()
			}
		})
	}

	closeDB() {
		this.db.close()
	}

	deleteDB() {
		indexedDB.deleteDatabase(this.dbName)
	}
}

以上是封装了DB的方法,下面是如何使用:

// 链接数据库
let indexddb = new DB('test')
indexddb.open('test', 'test_data')

// 添加数据
indexddb.add('test', {a: 1})
// 获取数据
indexddb.getList('test').then((res: any) => {
	console.log(res)
})

// 删除数据(key是获取数据时返回的id)
indexddb.delete('test', key)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IndexDB是浏览器提供的一种本地存储数据库,它允许网页应用程序在浏览器中存储大结构化数据,并且可以在无网络连接的情况下访问这些数据。 要在IndexDB中存储数据,你首先需要打开一个数据库。可以使用以下代码创建或打开一个数据库: ```javascript let request = indexedDB.open('myDatabase', 1); request.onerror = function(event) { console.log('Database error: ' + event.target.errorCode); }; request.onupgradeneeded = function(event) { let db = event.target.result; let objectStore = db.createObjectStore('myObjectStore', { keyPath: 'id' }); objectStore.createIndex('name', 'name', { unique: false }); }; request.onsuccess = function(event) { let db = event.target.result; // 可以在这里执行对数据库的操作 }; ``` 在创建或打开数据库后,你可以创建一个对象存储(Object Store)来存储数据。对象存储类似于关系数据库中的表,你可以定义每个对象存储的键路径(keyPath)和索引。 要存储数据到IndexDB中,你可以使用以下代码: ```javascript let transaction = db.transaction(['myObjectStore'], 'readwrite'); let objectStore = transaction.objectStore('myObjectStore'); let data = { id: 1, name: 'John Doe', age: 30 }; let request = objectStore.add(data); request.onerror = function(event) { console.log('Error adding data: ' + event.target.error); }; request.onsuccess = function(event) { console.log('Data added successfully'); }; ``` 以上代码创建了一个事务(transaction),然后通过对象存储(object store)的add()方法将数据添加到数据库中。 你可以使用其他方法如put()、get()、delete()等来执行相应的操作。 希望以上信息对你有帮助!如有更多问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值