可能有点吹毛求疵了,但是确实看着很不舒服,虽然并没有对业务造成什么影响。
子组件内 调用 triggerEvent(‘someevent’) 向父组件传递事件,父组件接收该事件后 卸载了(wx:if) 子组件,此时会报错,在someevent 内添加一个延时这个错误就不会出现,。。。问题应该是 子组件生命周期走完之前,子组件被卸载了。。。,
框架类型 | 问题类型 | API/组件名称 | 终端类型 | 操作系统 | 微信版本 | 基础库版本 |
---|---|---|---|---|---|---|
小程序 | Bug | triggerEvent | 微信iOS客户端 | 6.6.7 | 2.09 |
2 个回答
你好,我大致猜出是个什么问题。
需要注意的点是:triggerEvent 是一个同步过程。如果在父组件 setData 过程中触发了子组件的 triggerEvent (此时父组件的此次 setData 还没有完全执行完毕),进而使得父组件又进行了一次 setData ,就有可能出现这个情况。
目前可以用一个 setTimeout 来规避问题(就像你上面做的那样)。我们在考虑添加一个更友好的接口来处理需要异步 triggerEvent 的情况。
你好,方不方便提供个代码片段(https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html),我们定位下问题呢?
截图吧,自组件内:父组件内:
视图层:
js:
js:
目前这个是加了一个timeout的延时,是不会报错的。如果去掉这个延时,就会报错。
这个才是代码片段( https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html )哦
我不想写代码片段了啊,哥哥。。。。所以就截图了啊,截图也很清楚了,自己动下手吧。。。。。复现还是很快的,过程就是 就是在子组件内触发一个事件, this.triggerEvent('someevent',somedata,{}),然后,父组件内接收这个事件,在这个事件内部,直接通过wx:if 卸载子组件。bindsomeevent=function(){
this.setData({
show:false
})
}
实测不影响业务。但是这个错确实是有报。至于会不会触发一些未知的事件,我不知道,这就是你们用户体验的事情了。 ,想不报错我加一个延时就不报了,提出来是为了一个更好的开发环境而已。。。
我不想写代码片段了啊,哥哥。。。。所以就截图了啊,截图也很清楚了,自己动下手吧。。。。。复现还是很快的,过程就是 就是在子组件内触发一个事件, this.triggerEvent('someevent',somedata,{}),然后,父组件内接收这个事件,在这个事件内部,直接通过wx:if 卸载子组件。bindsomeevent=function(){
this.setData({
show:false
})
}
实测不影响业务。但是这个错确实是有报。至于会不会触发一些未知的事件,我不知道,这就是你们用户体验的事情了。 ,想不报错我加一个延时就不报了,提出来是为了一个更好的开发环境而已。。。
我在vue里有同样的操作是不会有这类报错的。