在vue方法中要谨慎定义递归函数

在开发Vue项目时,作者遇到在后台管理系统中对表单对象进行深拷贝的需求。为避免引入大型依赖lodash,作者决定自定义深拷贝函数。在实现过程中,由于递归调用的细节问题导致了错误。经过调试,作者发现需要在递归调用时使用`this`关键字来确保Vue能够识别方法,最终成功实现了深拷贝。作者强调在Vue中使用递归函数时要留意`this`的使用,同时提醒开发者对`this`的处理要格外小心。
摘要由CSDN通过智能技术生成

在肝电商后台管理系统的项目时,希望对提交到表单对象做一个深拷贝从而对新对象中的数据进行后台数据匹配,教程中的方法是安装lodash依赖,其中提供了深拷贝的方法,一搜发现这个依赖居然有180M!不就是实现一个深拷贝嘛,于是我就想在methods中自己定义了一个深拷贝函数:

 methods: {
    //深拷贝
    deepClone(obj) {
      if (typeof obj !== 'object' || obj == null) {
          // obj 是 null ,或者不是对象和数组,直接返回
          return obj
      }
      // 初始化返回结果
      let result
      if (obj instanceof Array) {
          result = []
      } else {
          result = {}
      }

      for (let key in obj) {
          // 保证 key 不是原型的属性
          if (obj.hasOwnProperty(key)) {
              // 递归调用!!!
              result[key] = deepClone(obj[key])
          }
      }
      // 返回结果
      return result
    },
    // 获取分类列表
    
    //点击添加按钮添加商品到数据库
    addGoods(){
      this.$refs.addRefs.validate((valid)=>{
        console.log(this.deepClone);
        if(!valid){
          return this.$message.error('请填写必要的表单项')
        }
        console.log(this.addForm);
        // const form = JSON.parse(JSON.stringify(this.addForm))
        const form = this.deepClone(this.addForm)
        form.goods_cate = form.goods_cate.join(',')
        console.log(form);

      })
    }
  },

点击添加按钮后,好家伙报错了:
在这里插入图片描述
但是我发现在addGoods函数中打印this.deepClone是可以拿到deepClone这个方法的,仔细回过头去看deepClone发现使用递归时用的是result[key] = deepClone(obj[key])! 这就导致了在第二次“递归”时,vue就不认得deepClone这个东西了,后来我想着将递归项换成result[key] = arguments.callee(obj[key]),运行代码后又会报错:
在这里插入图片描述
这好像是因为caller callee arguments无法在严格模式下使用。当我想用JSON方法进行深拷贝的时候(const form = JSON.parse(JSON.stringify(this.addForm)) 事实证明是有效的~~),我发现好像可以在将递归项的deepClone前加上this

for (let key in obj) {
          // 保证 key 不是原型的属性
          if (obj.hasOwnProperty(key)) {
              // 递归调用!!!
              result[key] = this.deepClone(obj[key])
          }
      }

这样每次“递归”,Vue都拿到这个deepClone,问题圆满解决。
总结来说就是,在vue中使用递归函数时,一定要注意递归项的写法。但其实在vue中不管是调用methods中的方法还是data中的数据,this是一个经常被忽略的问题,一定要仔细对待,多码多码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值