【JavaScript踩坑记录】

数组push踩坑记录

问题介绍

最近在写一个嵌套了表格的对话框,要实现点击一个按钮就弹出一个新对话框,对话框内有一系列配置项,配置保存后为表格新增一行的功能,数据结构比较复杂。
对话框数据结构为:

editTableForm: {
  name: "",
  setupCfg: []
}

其中setupCfg里是表格数据。
点击按钮后的对话框配置项数据结构为:

selectProcedureForm: {
   id: null,
   name: "",
   params: ""
}

这些数据会被整个push到前面的setupCfg里。
selectProcedureForm相关的前端操作涉及到下拉框,代码为:

<el-dialog :title="procedureDialogTitle" :visible.sync="procedureDialogVisible">
        <el-form
          ref="selectProcedureForm"
          :model="selectProcedureForm"
        >
          <el-form-item>
            <el-select
              v-model="selectProcedureForm.id"
              @change="handelProcedureChange(selectProcedureForm.id)">
              <el-option
                v-for="item in procedureList"
                :key="item.id"  
                :value="item.id"
                :label="item.name"
              ></el-option>
            </el-select>
          </el-form-item>
          <el-form-item label="参数内容">
            <el-input type="textarea" v-model="selectProcedureForm.params"></el-input>
          </el-form-item>
        </el-form>
        <div slot="footer" class="dialog-footer">
          <el-button @click="procedureDialogVisible = false">取 消</el-button>
          <el-button type="primary" @click="handleProcedureEditSave">确定</el-button>
        </div>
      </el-dialog>

原本的写法是,this.editTableForm.push(selectProcedureForm),理论上push两条的话,表格结果应该为:

[{id: 1, name: "各地广泛但是", params: '{"count": 24, "range": [1,3,4]}'},
 {id: 2, name: "帆帆帆帆", params: '{"count": "dffggf"}'}]

结果发现第二次新增时,下拉框选择确定后就会把第一次的id改掉,导致最后有两条id一样的数据
错误数据:

[{id: 2, name: "各地广泛但是", params: '{"count": 24, "range": [1,3,4]}'},
 {id: 2, name: "帆帆帆帆", params: '{"count": "dffggf"}'}]

解决办法

push前使用深拷贝:

const a = deepClone(this.selectProcedureForm);
this.editTableForm.setupCfg.push(a)

总结

数组push时实际上是引用对象,而引用意味着之后对象属性的修改数组仍能获取到,
下拉框里双向数据绑定也引用了这个对象,就导致第二次下拉框数据的改变影响到了已经push进数组的数据。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值