收藏
回答

getCurrentPages使用问题 及 setData() 函数问题?

如下:

页面A :

data: {

    goodslist:[1,2,3,4]

}

页面B:

data: {

    gdlist:[]

}

onLoad: function(){

    var page = util.getPrevPage();//这个函数不做说明,反正可以获取到页面A

this.setData({

        gdlist: page.data.goodslist,

});

//问题来了:

this.setData({

'gdlist[0]':10000

})

这个时候会发现不但页面B 的gdlist 的值更改了,页面A的goodslist的值也改了。

但如果这样:

this.setData({

gdlist:[10000,2,3,4]

})

这种只更新页面B的gdlist

}

在开发工具里 iphone 5 6 7 ..... 所有的都试过 一样。手机 iphone 6 微信版本 7.0.5 试过也是一样的。

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

2 个回答

  • Xs
    Xs
    2019-09-04

    原因是这样:

    this.setData({

            gdlist: page.data.goodslist,

    });

    因为数组(对象)是引用数据类型,你把A页面的地址和值都赋给了B页面的gdlist字段;当你

    this.setData({

    'gdlist[0]':10000

    })时,其实只是在这个地址中修改了第0项属性的值,由于gdlist, goodslist公用一个引用地址,所以两边都改变了。

    当你

    this.setData({

    gdlist:[10000,2,3,4]

    })时,[10000,2,3,4]是一个新的数组,有自己的引用地址,赋值后相当于直接改变了字段gdlist的引用地址,直接指向[10000,2,3,4]这个数组的引用,而goodslist依然指向原来的引用地址


    2019-09-04
    有用 3
    回复 2
    • Xs
      Xs
      2019-09-04
      如果想不影响数据的变动,并且数据的类型相对简单,可以采用浅拷贝,列如:对象,数组的扩展语法等等
      2019-09-04
      回复
    • Kobe黎科宁
      Kobe黎科宁
      2019-12-07
      应该怎么处理?有实例吗?
      2019-12-07
      回复
  • 所罗门~赵
    所罗门~赵
    2020-09-09

    不要在 App.onLaunch 的时候调用 getCurrentPages(),此时 page 还没有生成。

    文档里说的很清楚了


    2020-09-09
    有用
    回复
登录 后发表内容
问题标签