收藏
回答

关于 triggerEvent 的一点bug

问题模块 框架类型 问题类型 API/组件名称 终端类型 操作系统 微信版本 基础库版本
API和组件 小程序 Bug triggerEvent 微信iOS客户端 6.6.7 2.09

可能有点吹毛求疵了,但是确实看着很不舒服,虽然并没有对业务造成什么影响。

子组件内 调用 triggerEvent(‘someevent’) 向父组件传递事件,父组件接收该事件后 卸载了(wx:if) 子组件,此时会报错,在someevent 内添加一个延时这个错误就不会出现,。。。问题应该是 子组件生命周期走完之前,子组件被卸载了。。。,

最后一次编辑于  2018-06-08  (未经腾讯允许,不得转载)
回答关注问题邀请回答
收藏

2 个回答

  • LastLeaf
    LastLeaf
    2018-06-11

    你好,我大致猜出是个什么问题。


    需要注意的点是:triggerEvent 是一个同步过程。如果在父组件 setData 过程中触发了子组件的 triggerEvent (此时父组件的此次 setData 还没有完全执行完毕),进而使得父组件又进行了一次 setData ,就有可能出现这个情况。


    目前可以用一个 setTimeout 来规避问题(就像你上面做的那样)。我们在考虑添加一个更友好的接口来处理需要异步 triggerEvent 的情况。

    2018-06-11
    赞同
    回复
  • 娇华
    娇华
    2018-06-10

    你好,方不方便提供个代码片段(https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html),我们定位下问题呢?

    2018-06-10
    赞同
    回复 4
    • 江月寒
      江月寒
      2018-06-11

      截图吧,自组件内:父组件内:

      视图层:

      js:
      js:

      目前这个是加了一个timeout的延时,是不会报错的。如果去掉这个延时,就会报错。

      2018-06-11
      回复
    • 娇华
      娇华
      2018-06-11回复江月寒

      这个才是代码片段( https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html )哦

      2018-06-11
      回复
    • 江月寒
      江月寒
      2018-06-11回复娇华

      我不想写代码片段了啊,哥哥。。。。所以就截图了啊,截图也很清楚了,自己动下手吧。。。。。复现还是很快的,过程就是 就是在子组件内触发一个事件, this.triggerEvent('someevent',somedata,{}),然后,父组件内接收这个事件,在这个事件内部,直接通过wx:if 卸载子组件。bindsomeevent=function(){

          this.setData({

          show:false

      })

      }


      实测不影响业务。但是这个错确实是有报。至于会不会触发一些未知的事件,我不知道,这就是你们用户体验的事情了。  ,想不报错我加一个延时就不报了,提出来是为了一个更好的开发环境而已。。。

      2018-06-11
      回复
    • 江月寒
      江月寒
      2018-06-11回复娇华

      我不想写代码片段了啊,哥哥。。。。所以就截图了啊,截图也很清楚了,自己动下手吧。。。。。复现还是很快的,过程就是 就是在子组件内触发一个事件, this.triggerEvent('someevent',somedata,{}),然后,父组件内接收这个事件,在这个事件内部,直接通过wx:if 卸载子组件。bindsomeevent=function(){

          this.setData({

          show:false

      })

      }


      实测不影响业务。但是这个错确实是有报。至于会不会触发一些未知的事件,我不知道,这就是你们用户体验的事情了。  ,想不报错我加一个延时就不报了,提出来是为了一个更好的开发环境而已。。。



      我在vue里有同样的操作是不会有这类报错的。

      2018-06-11
      回复