vue项目表单自动保存(定时缓存)功能 + beforeRouteLeave钩子函数使用

也是最近公司项目遇到的需求,和其它大佬实现方法些许不同,这边进行整理 方便自己方便大家哈哈

1、首先要写一个将数据缓存到本地的方法

setLocal() {
      //console.log("我set了一次")
      let localData =this.form.getFieldsValue()
      let questions = []
        this.input.map(item => {
          if(item.question!==''||item.answer!=='')
          questions.push(item)
        })
        localData.tips = questions
        localData.beginTime = localData.beginTime?localData.beginTime.format("YYYY-MM-DD"):null
        console.log(localData)
        let valuesStr = JSON.stringify(localData)
        window.localStorage.setItem('recordData',valuesStr)
        this.$message.success('保存成功!');
    },

这里有很多业务代码 参考价值不大
其实主要就是 window.localStorage.setItem(‘recordData’,valuesStr) 这行代码

注:localStorage只能set字符串格式的数据,所以别忘了先用JSON.stringify()转成字符串 稍后取数据再用JSON.parse()转回对象即可

2、页面加载mounted取数据

if(window.localStorage.getItem('recordData')) {
          let getLocal = JSON.parse(window.localStorage.getItem('recordData'))
          console.log(getLocal)
          this.$nextTick(() => {
              this.form.setFieldsValue(pick(getLocal,'beginTime','address','recorder','asker','joinIds','remark','nmgName','tele','leaveAddr','workCom','ageNum','gender','education','nmgIds'))
              this.form.setFieldsValue({beginTime:getLocal.beginTime?moment(getLocal.beginTime):null})
          });
          if(getLocal.tips.length<= this.input.length) {
            getLocal.tips.map((item,index) => {
              this.input[index] = item
            })
          }else {
            this.input = getLocal.tips
            let num = Number(getLocal.tips.length)-3
            for (i = 0; i < num; i++) {
              this.questionArray.push({})
            }
          }
          console.log(this.input)
        }

主要代码:JSON.parse(window.localStorage.getItem(‘recordData’)
取出数据后,按照自己的情况,将数据填充至表单即可 (我这里使用的UI框架是vue ant design )

3、开启定时器
再然后就是关键的 怎么定时自动保存呢?

当然是要用到定时器啦,but单纯的使用setInterval会导致页面卡死,setInterval不会清除定时器队列,每重复执行1次都会导致定时器叠加,最终卡死,但是setTimeout是自带清除定时器的,因此此方法可以实现每隔一段时间执行一次方法的功能。以下方法在method里定义 created或者mounted里调用都可以

changeValue() { 
      //console.log("我是定时器 ")
      this.timer = window.setInterval(() => {
        setTimeout(this.setLocal(), 0)
      }, 10000)
    }

4、关闭定时器
由于我的项目是一个管理系统,所以有时只是切换路由,并未将表单页面销毁,所以这里关闭定时器的操作我就没放在beforeDestroy钩子里,而是一个离开当前路由之前的钩子函数-- beforeRouteLeave代码如下

beforeRouteLeave(to, form, next) {
    if (this.timer) { // 如果定时器还在运行 或者直接关闭,不用判断
      clearInterval(this.timer) // 关闭
    }
    next()
  }

到这里就基本实现了我想要的效果了,暂时还没发现“副作用” 哈哈哈坐等测试,如有相关bug,这边再更~

等下 这边补充下关于路由切换的另一个钩子
切换进入当前路由之前的钩子函数 beforeRouteEnter

beforeRouteEnter(to, form, next) {
	//离开该路由之前想进行的操作
    next()
  }

ok 溜ヾ( ̄▽ ̄)ByeBye

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页