收藏
回答

用setdata直接传递整个数组或者对象的困惑

框架类型 问题类型 终端类型 微信版本 基础库版本
小程序 Bug 工具 7.0.3 2.4.2

按本人之前的理解,用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整个对象

最后一次编辑于  2019-04-16
回答关注问题邀请回答
收藏

1 个回答

  • xx
    xx
    2019-04-16

    !找到了一个表象原因,在测试代码的.json配置文件中,比如index.json,如果有声明:

    "usingComponents": {}

    那么上面的预期一致,t和this.data.ttt是相同的,感觉是引用了。


    如果没有,t和this.data.ttt是不同的,感觉是完全不同的内存空间,在官方demo和weui的相关index.json配置文件中,都没有usingComonents。


    那么这个深层次原因是什么?

    求大佬解惑

    2019-04-16
    赞同
    回复 1
    • xx
      xx
      2019-04-16

      找到官方文档的一段话:


      注意,是否在页面文件中使用 usingComponents 会使得页面的 this 对象的原型稍有差异,包括:

      • 使用 usingComponents 页面的原型与不使用时不一致,即 Object.getPrototypeOf(this) 结果不同。

      • 使用 usingComponents 时会多一些方法,如 selectComponent

      • 出于性能考虑,使用 usingComponents 时, setData 内容不会被直接深复制,即 this.setData({ field: obj })this.data.field === obj 。(深复制会在这个值被组件间传递时发生。)

      如果页面比较复杂,新增或删除 usingComponents 定义段时建议重新测试一下。


      2019-04-16
      回复
登录 后发表内容