Vue项目里利用JS深拷贝(函数,Date,RegExp,Map,Set)重新初始化data的数据

本文介绍了如何在Vue中使用深拷贝技术来实现在组件间切换时保持或刷新list组件的数据状态。通过创建一个深度拷贝函数`deepCopy`,根据数据类型分别处理对象、数组等复杂类型的拷贝,然后使用`Object.assign`结合深拷贝结果来初始化组件的`$data`,从而达到在从detail组件返回时保持list组件数据,而从其他组件进入时刷新list组件的效果。
摘要由CSDN通过智能技术生成

前言

最近遇到一个需求,keep-alive 缓存 list 组件,从 detail 组建返回 list 组件,list 组件不刷新,从别的组件跳到 list 组件,list 组件数据初始化(从而实现 list 组件的刷新)。这里如何实现组件数据重新初始化呢?我想到的是利用 JS 深拷贝去实现。

数据深拷贝

  • 判断数据类型

    // 检查属性类型
    checkType (any) {
      return Object.prototype.toString.call(any).slice(8, -1)
    },
    
  • 深度拷贝(这里是在 Vue 项目写的,故这里展示的代码时常需要用到 this. )

    // 深度拷贝
    deepCopy (obj) {
      const type = this.checkType(obj)
      if (type === 'Object') {
        const temp = Object.create(Object.prototype)
        for (let key in obj) {
          if (Object.prototype.hasOwnProperty.call(obj, key)) {
            temp[key] = this.deepCopy(obj[key])
          }
        }
        return temp
      } else if (type === 'Array') {
        const temp = []
        for (let i = 0; i < obj.length; i++) {
          temp[i] = this.deepCopy(obj[i])
        }
        return temp
      } else if (type === 'Function') {
        return obj.bind(this)
      } else if (type === 'Date') {
        return new Date(obj.value)
      } else if (type === 'RegExp') {
        return new RegExp(obj)
      } else if (type === 'Set') {
        const temp = new Set()
        for (let val of obj.values()) {
          temp.add(this.deepCopy(val))
        }
        return temp
      } else if (type === 'Map') {
        const temp = new Map()
        obj.forEach((value, key) => {
          temp.set(key, this.deepCopy(value))
        })
        return temp
      }
      return obj
    },
    

重新初始化 data 的数据

在初始化之前,我们需要先了解以下两个数据以及一个方法

  • 当前组件的 data :this.$data
  • 当前组件初始化的 data :this.$options.data()
  • 将 other 的属性赋给(重复的会覆盖)cur :Object.assign(cur, other)

了解了上面的知识点,我们不难想到如何去实现初始化 data 的数据了:

Object.assign(this.$data, this.deepCopy(this.$options.data()))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值