评论

EventChannel 页面间数据传递 是 引用类型

通过EventChannel页面传递数据是引用类型

项目中遇到,通过navigateTo跳转新页面,通过EventChannel,acceptDataFromOpenerPage,获取到数据。

在新页面中setData数据、修改数据,返回老页面,再回到新页面,数据竟然是上次setData改变过的数据,而不是老页面原有的数据。

说明通过EventChannel传递的数据是引用类型数据。

解决办法是在新页面获取到数据后,深拷贝数据,再setData,处理修改数据。这样保持独立,不会污染老页面的数据。

最后一次编辑于  2022-03-24  
点赞 1
收藏
评论

4 个评论

  • 清蒸鱼
    清蒸鱼
    2023-08-25

    你这个从新页面B返回老页面A的时候,B就已经关掉了,再从A到新页面已经是B1了

    2023-08-25
    赞同
    回复
  • 坏蛋
    坏蛋
    2022-09-19

    问一下,我传递的是一组数据(一个结构体),怎么按照原有格式接收并保存在新页面(有一个同样的结构体),看日志他确实送过来了,日志也可以展开查看,但是我程序该怎么处理呢?怎么拿到具体每一项的数值?

    res.eventChannel.emit('sendparam', { data: send_data[i] });//send_data就是那个结构体
    
    //另一个页面接收
    eventChannel.on('sendparam'function (data{
          console.log(data);//结果是对的,但我程序上怎么处理,
     page_data = data;//这是我尝试用直接赋值的方式,结果一个数据都拿不到
    }
    
    2022-09-19
    赞同
    回复 2
    • 坏蛋
      坏蛋
      2022-09-19
      我知道了,。。。
      2022-09-19
      回复
    • simple
      simple
      2022-09-20
      业务逻辑写在function内部是没问题的,涉及页面更新使用setData更新下数据
      2022-09-20
      回复
  • balancscy
    balancscy
    2022-04-23

    验证过了,就如作者所言。其实还是基础知识,js基本类型是值传递,对象是共享传递,直接修改对象不会对原对象造成影响,但是修改对象的属性时会影响到原对象。因为对象传递本质上传的是地址,直接通过赋值修改对象就是将对象重新指向了新的地址,而修改对象的属性时地址并没有发生改变。

    2022-04-23
    赞同
    回复
  • balancscy
    balancscy
    2022-04-23

    真的?感觉不太可能

    2022-04-23
    赞同
    回复
登录 后发表内容