项目中遇到,通过navigateTo跳转新页面,通过EventChannel,acceptDataFromOpenerPage,获取到数据。
在新页面中setData数据、修改数据,返回老页面,再回到新页面,数据竟然是上次setData改变过的数据,而不是老页面原有的数据。
说明通过EventChannel传递的数据是引用类型数据。
解决办法是在新页面获取到数据后,深拷贝数据,再setData,处理修改数据。这样保持独立,不会污染老页面的数据。
通过EventChannel页面传递数据是引用类型
项目中遇到,通过navigateTo跳转新页面,通过EventChannel,acceptDataFromOpenerPage,获取到数据。
在新页面中setData数据、修改数据,返回老页面,再回到新页面,数据竟然是上次setData改变过的数据,而不是老页面原有的数据。
说明通过EventChannel传递的数据是引用类型数据。
解决办法是在新页面获取到数据后,深拷贝数据,再setData,处理修改数据。这样保持独立,不会污染老页面的数据。
4 个评论
你这个从新页面B返回老页面A的时候,B就已经关掉了,再从A到新页面已经是B1了
问一下,我传递的是一组数据(一个结构体),怎么按照原有格式接收并保存在新页面(有一个同样的结构体),看日志他确实送过来了,日志也可以展开查看,但是我程序该怎么处理呢?怎么拿到具体每一项的数值?
res.eventChannel.emit('sendparam', { data: send_data[i] });//send_data就是那个结构体 //另一个页面接收 eventChannel.on('sendparam', function (data) { console.log(data);//结果是对的,但我程序上怎么处理, page_data = data;//这是我尝试用直接赋值的方式,结果一个数据都拿不到 }
验证过了,就如作者所言。其实还是基础知识,js基本类型是值传递,对象是共享传递,直接修改对象不会对原对象造成影响,但是修改对象的属性时会影响到原对象。因为对象传递本质上传的是地址,直接通过赋值修改对象就是将对象重新指向了新的地址,而修改对象的属性时地址并没有发生改变。
真的?感觉不太可能