按本人之前的理解,用setdata修改某整个数组或者对象,属于引用
因此,下面的代码,在变量t和this.data.ttt通过setdata建立引用关系后,修改t,那么ttt应该相应变动,虽然没有渲染,变量t和this.data.ttt是相同内存的,预期最后的console.log输出应该是一致的,
let t = [{ key1: 999 }] this .setData({ ttt: t }) t[0].key1 = 888 console.log(JSON.stringify(t)) console.log(JSON.stringify( this .data.ttt)) |
这一段代码放在我自己正在开发的小程序的index页面的onload()中,表现和预期一致:
!!诡异的事情是这样发生的,把同一段代码放到官方的小程序demo或者weui演示里面的index页面的onload()中,表现确完全不同,t和this.data.ttt的值不同了,结果如下
求大佬解惑
附:setdata整个数组或者对象,个人主要用在这样的情形:对整个需要渲染的数组,需要进行相对复杂的逻辑处理,为了避免频繁的setdata单个元素或者属性,采取了在整个逻辑处理完毕后,再一次性setdata整个对象
!找到了一个表象原因,在测试代码的.json配置文件中,比如index.json,如果有声明:
"usingComponents"
: {}
那么上面的预期一致,t和this.data.ttt是相同的,感觉是引用了。
如果没有,t和this.data.ttt是不同的,感觉是完全不同的内存空间,在官方demo和weui的相关index.json配置文件中,都没有usingComonents。
那么这个深层次原因是什么?
求大佬解惑
找到官方文档的一段话:
注意,是否在页面文件中使用
usingComponents
会使得页面的this
对象的原型稍有差异,包括:使用
usingComponents
页面的原型与不使用时不一致,即Object.getPrototypeOf(this)
结果不同。使用
usingComponents
时会多一些方法,如selectComponent
。出于性能考虑,使用
usingComponents
时,setData
内容不会被直接深复制,即this.setData({ field: obj })
后this.data.field === obj
。(深复制会在这个值被组件间传递时发生。)如果页面比较复杂,新增或删除
usingComponents
定义段时建议重新测试一下。