开发背景
公司需要开发一款移动端应用,使用vue开发,用户录入表单需要本地缓存,刷新页面,或者不小心关掉重新进来,上次录入的信息还要存在。
这里有两种方案,第一种就是像博客平台一样,实时保存暂存文件到后端。每隔1-2秒调一次保存接口,但是这种成本较高,开发困难。
第二种方案就是,前端开发缓存插件,暂存数据保存在前端。
技术方案
采用vue自定义指令结合localstorage开发本地缓存策略
开发细节
1. 新建一个directive文件夹
2. index.ts ,绑定指令事件函数
export default function (app: any) {
app.directive('storageInput', {
created(el, binding) {
console.log(el, binding, '1') // 项目加载后执行
el.addEventListener('click', handleClick(binding), false)
},
updated(el, binding) {
console.log(el, binding, '2') // 页面文档变更时执行
el.addEventListener('click', handleClick(binding), false)
}
})
}
3. 主要函数方法
/**
* @Description: v-storage-input='["insured", "gender", item.gender, index+1]'
* @param el
* @param binding
*/
import { localStore } from 'wfl-utils'
import { Const } from '/@/utils/constant'
const { SIExpireTime } = Const // 18000s 300分钟
function handleClick(binding) {
function handle() {
const objInstance = binding.value
if (Array.isArray(objInstance) && objInstance.length > 0) {
setStorage(objInstance)
}
}
function setStorage(key) {
const objKey = key[0] // 获取需要存的对象key值 payer: {username: ''} payer既为key
const fieldKey = key[1]
const fieldValue = key[2]
const fieldIndex = key[3]
if (isNotNull(fieldIndex)) {
// 保存数组,eg: insured
const originObjKey = localStore.getItem(objKey)
if (originObjKey) {
// 如果原来有值的话先获取,在原来的地方push
if (originObjKey.length <= fieldIndex) {
originObjKey.push({})
}
originObjKey[fieldIndex][fieldKey] = fieldValue
localStore.setItem(objKey, originObjKey, SIExpireTime)
} else {
const obj = {
[fieldKey]: fieldValue
}
localStore.setItem(objKey, [obj], SIExpireTime)
}
} else {
const originObjKey = localStore.getItem(objKey)
if (originObjKey) {
// 如果原来有值的话先获取,在原来的地方push
originObjKey[fieldKey] = fieldValue
localStore.setItem(objKey, originObjKey, SIExpireTime)
} else {
// 初始化时,local里没有值时
const obj = {
[fieldKey]: fieldValue
}
localStore.setItem(objKey, obj, SIExpireTime)
}
}
}
handle()
return handle
}
function isNotNull(val) {
return val !== undefined && val !== null && val !== 'undefined' && val !== ''
}
上述代码主要思想是:保存用户录入数据到localStorage 先获取本地缓存key对应的值,如果没有就赋值存缓存并设置有效期, 用到wfl-utils这个插件。 如果有值则重新赋值覆盖到原来的对象字段上。
主方法里有if else 是判断是否有第四个参数,第四个参数是外层for循环的序号。
需要录入的是一个for循环数组需要加上第四个参数 如果是一个单出的form表单,大对象结构就不需要加第四个参数。
然后directive文件夹下新增index.ts
import storageInput from '/@/directive/storageInput'
export default function registerDirectives(app: any) {
storageInput(app)
}
### 4. main.ts 注册指令
// 自定义指令
import registerDirectives from '/@/directive'
registerDirectives(app)
5. 代码使用
只有一个大对象的表单使用
总结
至此,vue3前端表单缓存自定义指令就开发完了,是不是非常简单?另外,只关注自己的一亩三分地,也是很难跳出程序员这个圈子的。前端开发,你的认知不能仅局限于技术内,需要发散思维了解技术圈的前沿知识。细心的人会发现,开发内部工具的过程中,大量的页面、场景、组件等在不断重复,这种重复造轮子的工作,浪费工程师的大量时间。
介绍一款程序员都应该知道的软件JNPF快速开发平台,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。
这是一个基于 Java Boot/.Net Core 构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,实现快速开发,提升工作效率;框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用;后端框架支持 Vue2、Vue3。如果你有闲暇时间,可以做个知识拓展。