本地存储之indexedDB的操作api -- localforage的使用

news2024/11/17 6:52:59

文章目录

    • 概述
    • 增删改查
      • 操作工具类封装
      • 前端api
      • 前端关键接口调用(以年度举例,其他维度类似)
        • 列表获取
        • 添加内容
        • 修改内容

概述

本地存储有好几种,每种的优缺点本文就不赘述了,一搜一大堆。
本文只介绍indexedDB的使用。
能够操作indexedDB的api有好几个。
官方Api
阮一峰的indexedDB教程
第三方操作api-idb:guthub | npm
第三方操作api-localforage:localforage(不仅仅操作indexedDB,也可以操作其他本地存储)
项目介绍: 本次主要使用localforage做一个计划表,采用年、月、周、日4个维度进行增改查。
遇到的问题:
在进行添加操作后,列表不能立马获取到新增的内容,所以目前采用setTimeout 延时获取列表,希望以后遇到更好的办法。关于localforage具体操作介绍,请查看上面的链接。

【视频审核后补偿】
计划页面及存储结构
存储计划
在这里插入图片描述

增删改查

操作工具类封装

// LocalForage.js
/**
* 删除采用的改标签,所以没有封装删除功能,直接使用的修改
*/
import LocalForage from "localforage";
// 默认添加的字段
const todoItem = {
    del: false, //进回收站
    deleted: false, //出回收站
    createTime: new Date().toISOString(),
}
// 创建实例,不同数据使用不同实例,由于数据是4个维度,所有需要使用实例,如果只有一个维度,这里可以省略,后续直接使用`LocalForage`进行操作就可以。
const createStore = (storeName) => {
    return LocalForage.createInstance({
        name: "plan-"+storeName
    });
}

// 获取列表:获取表数据
const getList = async (tableName) => {
    const arr = []
    await createStore(tableName).iterate((value, key, idx) => {
        value['id'] = key
        arr.push(value)
    })
    return new Promise((resolve, reject) => {
        resolve(arr.sort((a, b) => b['id'] - a['id']))
    })
}

// 添加
const add = async (tableName, data) => {
    Object.assign(data, todoItem)
    const key = String(new Date().getTime())
    data['id']=key  // 把存库的key也在数据存一份,方便后期修改数据使用
    const res = createStore(tableName).setItem(key, data)
    return new Promise((resolve, reject) => {
        resolve(res)
    })
}
// 编辑
const edit = (tableName,data) => {
    const res = LocalForage.setItem(data['id'], data)
    return new Promise((resolve, reject) => {
        resolve(res)
    })
}
export { getList, add, edit}

前端api

// @/api/plan.js
import { getList, add, edit} from "@/libs/LocalForage";
// 获取列表:年度列表
export const getListYear = async (params) => {
	const res = await getList('year')
	return new Promise((resolve, reject) => {
		resolve({
			data: res,
			code: 200
		})
	})
}
// 添加:年度数据
export const addYear = async (data) => {
	const res = await add('year', data)
	return new Promise((resolve, reject) => {
		resolve({
			data: res,
			code: 200
		})
	})
}
// 编辑:年度计划
export const editYear = async (data) => {
	const res = await edit('year', data)
	return new Promise((resolve, reject) => {
		resolve({
			data: res,
			code: 200
		})
	})
}

// 获取列表:月度列表
export const getListMonth = async (params) => {
	const res = await getList('month')
	return new Promise((resolve, reject) => {
		resolve({
			data: res,
			code: 200
		})
	})
}
// 添加:月度数据
export const addMonth = async (data) => {
	const res = await add('month', data)
	return new Promise((resolve, reject) => {
		resolve({
			data: res,
			code: 200
		})
	})
}
// 编辑:月度计划
export const editMonth = async (data) => {
	const res = await edit('month', data)
	return new Promise((resolve, reject) => {
		resolve({
			data: res,
			code: 200
		})
	})
}

// 获取列表:周度列表
export const getListWeek = async (params) => {
	const res = await getList('week')
	return new Promise((resolve, reject) => {
		resolve({
			data: res,
			code: 200
		})
	})
}
// 添加:周度数据
export const addWeek = async (data) => {
	const res = await add('week', data)
	return new Promise((resolve, reject) => {
		resolve({
			data: res,
			code: 200
		})
	})
}
// 编辑:周度计划
export const editWeek = async (data) => {
	const res = await edit('week', data)
	return new Promise((resolve, reject) => {
		resolve({
			data: res,
			code: 200
		})
	})
}
// 获取列表:日度列表
export const getListDay = async (params) => {
	const res = await getList('day')
	return new Promise((resolve, reject) => {
		resolve({
			data: res,
			code: 200
		})
	})
}
// 添加:日数据
export const addDay = async (data) => {
	const res = await add('day', data)
	return new Promise((resolve, reject) => {
		resolve({
			data: res,
			code: 200
		})
	})
}
// 编辑:日度计划
export const editDay = async (data) => {
	const res = await edit('day', data)
	return new Promise((resolve, reject) => {
		resolve({
			data: res,
			code: 200
		})
	})
}

前端关键接口调用(以年度举例,其他维度类似)

列表获取

// list.vue
import { getListYear as getList } from "@/api/plan";
getListFun() {
  getList().then((res) => {
    if (res && res.data && res.data.length > 0) {
      this.list = res.data;
    }
  });
},

添加内容

// addModal 新增弹框
import { addYear as add } from "@/api/plan";
addFun() {
  add(this.form).then((res) => {
    if (ree) {
      this.$Message.success("提交成功");
    }
  });
},

修改内容

由于每次点击的时候,本身就是获取的当前项,这里就不用拿id进行查找了,直接把内容提交就可以。

// 列表项组件 listItem.vue
import { editYear as edit } from "@/api/plan";
editFun() {
  edit(this.form).then((res) => {
    if (ree) {
      this.$Message.success("提交成功");
    }
  });
},

由于本人水平有限,目前只能写成这样,如果您有更好的建议,欢迎指导。

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

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

相关文章

Redis实现分页+多条件模糊查询组合方案

导言 Redis是一个高效的内存数据库,它支持包括String、List、Set、SortedSet和Hash等数据类型的存储,在Redis中通常根据数据的key查询其value值,Redis没有模糊条件查询,在面对一些需要分页、排序以及条件查询的场景时(如评论&…

spring boot 集成dubbo

本demo使用spring boot 2.4.1版本集成 dubbo 2.7.15 1.创建maven项目及其子模块 父工程pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.ap…

个人微信开发API,微信机器人开发

安卓微信的api&#xff0c;个人微信开发API协议&#xff0c;微信 ipad &#xff0c;微信ipad协议&#xff0c;微信web版接口api&#xff0c;微信网页版接口&#xff0c;微信开发sdk&#xff0c;微信开发API&#xff0c;微信协议&#xff0c;微信接口文档&#xff0c;网页个人微…

不清晰的照片怎么变清晰?这几个方法轻松处理!

大家都会碰到老旧照片放大后变得模糊不清的情况&#xff0c;可惜我们无法在网上下载原图&#xff0c;这是我们自己的照片。那有没有简便的方法修复模糊照片呢&#xff1f;很多人会提到使用PS&#xff0c;但操作复杂需要基本技能。除了PS&#xff0c;还有其他方法修复模糊照片。…

图片速览 Deep k-Means: Jointly clustering with k-Means and learning representations

本文探讨了联合聚类与学习的问题 交涉。正如之前的几项研究表明&#xff0c;学习 既忠实于要聚类和调整的数据的表示形式 到聚类算法可以导致更好的聚类性能&#xff0c;所有的 更重要的是&#xff0c;这两项任务是联合执行的。我们在这里提出这样一个 方法的k-基于连续重新参数…

每天一道C语言编程练习(5):尼科彻斯定理

题目描述 验证尼科彻斯定理&#xff0c;即&#xff1a;任何一个整数m的立方都可以写成m个连续奇数之和。 输入格式 任一正整数 输出格式 该数的立方分解为一串连续奇数的和 样例输入 13 样例输出 13*13*132197157159161163165167169171173175177179181 代码如下&#…

【前端知识】React 基础巩固(二十七)——Fragment

React 基础巩固(二十七)——Fragment Fragment Fragment 允许将子列表分组&#xff0c;而无需向 DOM 添加额外节点可以采用语法糖<></>来替代 Fragment&#xff0c;但在需要添加 key 的场景下不能使用此短语 import React, { PureComponent, Fragment } from &q…

VUE之基本部署及VScode常用插件

参考资料&#xff1a; 参考视频 VScode常用插件清单 node.js官网 node.js官网中文版 VUE官方文档 VScode常用插件&#xff1a; VScode常用插件详解见上述连接&#xff0c;插件列表如下&#xff1a; VScode的注释/取消注释快捷键为&#xff1a;Ctrl/ VUE的基本安装部署--…

shardingsphere mybatisplus properties和yml配置实现、分页配置

shardingsphere mybatisplus properties和yml配置实现 目录结构 model package com.oujiong.entity;import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import org.springframework.format…

【JAVA】——环境配置安装

一.Java简介 1.1 Java的特点 Java是一种跨平台、面向对象的程序设计语言&#xff0c;用它编写的程序可以在任何计算机操作系统和支持Java的硬件设备上运行。Java是一种通过解释方式来执行的语言&#xff0c;那么什么是解释方式呢&#xff1f; 程序员编写的代码一般都是用高级语…

程序员的自我修养(2)

目标文件的学习 1.什么是目标文件以及格式 目标文件为编译器编译后生成的文件&#xff0c;就是window下的.obj&#xff0c;linux下的.o文件。与可执行文件格式几乎一样&#xff0c;因为只是缺少链接过程。所以可执行文件&#xff0c;动态链接库&#xff0c;静态链接库&#xf…

B070-项目实战-用户模块--手机注册

目录 用户模块需求分析静态网站部署与调试两种前端项目的部署两种前端项目的调试(热部署)创建静态web项目 注册分析与设计分析需求设计 界面设计&#xff08;ui&#xff09;设计表&#xff08;后台&#xff09; 流程设计&#xff08;后台&#xff09;三范式表设计流程设计 相关…

英语动词-分类及应用

文章目录 1.实义动词系动词情态动词 1.实义动词 实义动词是表示具体动词的词。 常见的分类&#xff1a;及物动词和不及物动词。 1.及物动词&#xff1a;transitive verb后面直接加宾语&#xff0c;并且必须加宾语。比如&#xff1a;I love you.I buy a book. 2.不及物动词&…

AI 智能对话 - ChatGLM2-6B 本地搭建入门

前情提要 这一个月来干了啥事情呢&#xff1f;AI 绘画搞了2周左右&#xff0c;SD 建筑绘图&#xff0c;训练 LORA &#xff0c;模型控制基本也上手了&#xff0c;可以按照预期生成自己想要的东西&#xff0c;那种控制感是挺开心的&#xff0c;不然你输入一句话生成 AI 图片完全…

Linux进程(三)---深入理解进程地址空间

目录 地址空间的划分及验证 所谓的地址空间是内存吗&#xff1f; 一种奇怪的现象(虚拟地址的引入) 什么是进程地址空间&#xff1f; 我们平常访问到的内存是物理内存吗&#xff1f; 深入理解区域划分 再谈奇怪的现象 fork()中为什么一个变量可以同时保存两个不同的值 …

网络安全—入职大厂经验之谈

大三想去实习&#xff0c;趁现在该干什么才能去大厂实习呢&#xff1f;想做一些事丰富一下自己的简历&#xff0c;只有打ctf&#xff1f;还是挖洞&#xff1f;非常迷茫。 或者入职转行网络安全行业应该怎么做&#xff1f;对于接下来的职业规划学习计划有什么打算&#xff1f; …

PETRv2: A Unified Framework for 3D Perception from Multi-Camera Images

PETRv2: A Unified Framework for 3D Perception from Multi-Camera Images 作者单位 旷视 目的 本文的目标是 通过扩展 PETR&#xff0c;使其有时序建模和多任务学习的能力 以此建立一个 强有力且统一的框架。 本文主要贡献&#xff1a; 将 位置 embedding 转换到 时序表…

漏洞复现 || Bitrix cms文件上传

免责声明 技术文章仅供参考&#xff0c;任何个人和组织使用网络应当遵守宪法法律&#xff0c;遵守公共秩序&#xff0c;尊重社会公德&#xff0c;不得利用网络从事危害国家安全、荣誉和利益&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此…

Go语言之流程控制语句,for循环

程序是由语句构成&#xff0c;而流程控制语句 是用来控制程序中每条语句执行顺序的语句。可以通过控制语句实现更丰富的逻辑以及更强大的功能。几乎所有编程语言都有流程控制语句&#xff0c;功能也都基本相似。 其流程控制方式有 顺序结构,分支结构,循环结构 1、switch比if el…

javaWeb之文件上传和下载

文件上传下载(场景): * 文件上传 * 客户端 * 文件上传页面(form) * 请求方式一定是POST. * 文件上传域(<input typefile>)必须具有name属性. * 表单的enctype属性值设置为"multipart/form-data". * 扩展:浏览器内核产品不同(不建…