当前位置: 首页 > Web前端 > vue.js

object.assgin导致的vue双向数据绑定失败

时间:2023-04-01 01:44:31 vue.js

前几天在写后台项目,使用object.assgin的时候,出现了一个很奇怪的bug,于是拍了个简单的demo特写一下探索它。demo是一个基本形式:只有name和hobbies在后台数据中有值。这时候根据后台数据给表单中的数据赋值:this.personData=res.data.userTableData效果很符合预期,随便点一下也没有其他问题:但是如果您按以下方式分配表单数据:Object.assign(this.personData,res.data.userTableData)有一个奇怪的现象。刷新后,表单没有初始值,对表单的修改不生效:此时修改motionbar的值后,发现前两列的数据终于更新了,但是前两列的数据还是不能直接修改。只有修改了sports栏的数据后,才会显示前两栏数据之前的修改。这让人想知道发生了什么。为此,查看了object.assgin相关的代码,发现了这篇文章:Object.myAssign=function(target,...src){for(leti=0;i触发setperson.name=>{name:"tom"}person.name.name=123123=>没有打印出任何信息,说明修改name的属性值没有触发set方法。person.name.sex=333=>没有打印出任何信息,说明添加name的属性值不会触发set方法。deleteperson.name.name=>没有打印出任何信息,说明删除name的属性值并没有触发set方法。Object.defineProperty(person.name,'name',{value:4444})=>没有打印出任何信息,说明Object.defineProperty没有触发set方法。我称之为好人。原来一个对象的双向数据绑定生效的条件就是这么苛刻。对象的赋值方法。不用找了。这时候第二个问题就产生了,为什么修改体育栏目中的数据会出现这样的异常现象呢?我认为对象添加新属性后,对其新属性的任何更改都不会触发双向数据绑定。这时候相当于只是给对象添加了一个指向新属性的指针。只有在修改motionbar的值时真正触发了set才会重新加载页面数据。关于对象的双向数据绑定是如何实现的,想过几天写一篇文章记录一下(flag)。总而言之,如果你想使用object.assgin,你可以这样写:this.personData=object.assgin({},res.data.userTableData)或者如果你想将两个属性组合在一起:this.personData=Object。Assign(Object.assign({},this.personData),res.data.userTableData)参考相关文章地址:https://segmentfault.com/a/11...https://www.cnblogs.com/yanze...