收藏
回答

引用其他页面this对象,调用setData无效?

目前是遇到了一个比较棘手的需求,我的页面是组件递归渲染的,有一些数据是通过mqtt送回的,送回后我要把这些数据渲染到递归的每一层中去。

我是这么做的,每一层递归在他的attached中都向一个ghapp中注册一个数组元素,像这样

//groupPanel.js

 attached() {
    ghApp.groupPanelCache(this)
   }

//ghApp.js

    groupPanelCache(data) {
        groupPanelList.push(data)
      }


这样我认为我已经把递归的组件的this对象缓存到ghApp.js中了,然后在数据送回后,我在ghApp中对比送回数据是属于哪一层的,然后去调用对应的this对象的seData(),

function onMessage(data) {
    for (let item of groupPanelList) {
        if (jsonpath.value(item.data.currGroup, "$.groups[?(@.parentDeviceId ==" + data.deviceId + ")]")) {
            ghMessageProcessor.updateChannelStatus({
                deviceId: data.deviceId,
                currStatus: item.data.currGroup,
                newStatus: data.msgFromRemote.data.ndPeriChannelList
            })
                  //上面的步骤已经把数据处理好了,现在只需要调用对应的setData就好了
            let currGroup = item.data.currGroup
            item.setData({
                currGroup
            }, () => {
                console.log(item.data.currGroup) 
                        //打印正常,实际上如果调用item的任何方法也都是正常的,
                        //比如我调用item(递归组件的this)的一个方法打印它的data,结果也是正确的
                })
            }
        }
  }  

    我想问一下,这样传过去的this是不是不能这么调啊,还是说有什么别的问题,或者大家有什么好的解决办法,能让我调到每一级的setData,或者有什么别的办法,不用wx:if的前提下可以渲染所有递归层级.

回答关注问题邀请回答
收藏

2 个回答

  • 微盟
    微盟
    2021-12-24

    两种可能:

    1. 你的组件是循环并逐层渲染的,但数据整体发生了变化导致你的组件进行了重新初始化,即重新生成,导致你虽然拿到了组件对象,但拿到的不是你眼前看到的那个,而是上一个已经被你销毁的,所以导致你的setData无法改变页面。
    2. 你的setData设置的数据就是你从view里面取出来的,相当于没变化,你是不是塞错数据了?
    // 这两行跑了等于没跑吧
    let currGroup = item.data.currGroup
    item.setData({
       currGroup
    })
    


    2021-12-24
    有用 1
    回复 5
    • 加伊
      加伊
      2021-12-24
      我觉得第一种可能性比较大,也是我没有想到过的,第二个吧,数据在调setData之前就已经处理好了。
      请问一下如果是第一种情况该怎么解决一下?
      2021-12-24
      回复
    • 加伊
      加伊
      2021-12-25
      想了一下,第一种可能也不大,因为即使重新初始化,也会重新向ghApp注册的,它的this也即时被更新了
      2021-12-25
      回复
    • 微盟
      微盟
      2021-12-25回复加伊
      你的数组有清空逻辑吗?没有的话它会一直往里面push,你在查找的时候,优先查找到的是上一次push进去的值
      2021-12-25
      回复
    • 加伊
      加伊
      发表于移动端
      2021-12-25回复微盟
      我靠,那确实没有,但是只有初始化的时候才会向数组push,这个过程只要不初始化组件理论上不会发生,你说的这个我回去试一下,感谢
      2021-12-25
      回复
    • 加伊
      加伊
      2021-12-29
      你好,问题已经解决了,感谢你的思路,我的解决方案是把需要渲染的地方单独做成了一个组件,然后在回调中选这个组件,再在组件内渲染,问题就解决了
      2021-12-29
      回复
  • 发飙的蜗牛
    发飙的蜗牛
    2021-12-24

    你去了解一下this的作用域

    2021-12-24
    有用
    回复 1
    • 加伊
      加伊
      2021-12-24
      我取到this了啊,函数也都能调用的到,只是setData不生效,请问大佬这是怎么回事
      2021-12-24
      回复
登录 后发表内容