vue 循环列表双向绑定后改变数据造成赋值死循环的解决方案

首先说需求

产品绑定多个渠道后, 每个渠道需要配置下级所有等级和分类组合的折扣价格

参考设计图稿

vue 循环列表双向绑定后改变数据造成赋值死循环的解决方案

先不谈等级和分类的组合

我们先思考渠道数据的显示

在基于上面多选输出后, 需要对比数据库数据是否存在, 如果存在则填充输入框的值,如果不存在则填充空数据

于是有这样的代码

 let listItem=this.formData.channelList.find(v=>
                                v.classifyId===channelItem.classifyCation[j].id &&
                                v.rankId===channelItem.rank[k].id &&
                                v.channelId===channelId
                            );
                            if(!listItem){
                                listItem={
                                    channelId:channelId,
                                    classifyId:channelItem.classifyCation[j].id,
                                    rankId:channelItem.rank[k].id,
                                    priceList:{},
                                    discountConfig:[],
                                    priceTypeId:'',
                                    visible:true,

                                };

                                    this.formData.channelList.push(Object.assign({},listItem));
                            }else{
                                if(!listItem.priceList)listItem.priceList=jt.keyValue(listItem.discountConfig);
                            }

这里 用到了 Object.assign 因为listItem 是 channelList.find得出的,

如果直接把listItem push到channelList就会马上触发channelList的set方法listItem的get方法

channelList有重新find出listItem 这里用Object.assign拷贝后阻断了这个循环

vue 循环列表双向绑定后改变数据造成赋值死循环的解决方案