- 当前 Bug 的表现(可附上截图)
Error: Expect END descriptor with depth 0 but get another
- 预期表现
不会出错
- 复现路径
Index页面结构:
-- CompA
--- CompB
场景:
CompA的wx:if由Index决定
CompB的wx:if由CompA决定
如果CompA关闭了,但是CompB的wx:if条件还在执行 =》 触发Bug
真实场景就是
CompA在2s会显示CompB的内容
但是如果CompA2s以内被关了,那么CompB就出错
详见代码片段
- 提供一个最简复现 Demo
自行代码片段
A组件卸载了再去调用 this 当然是有问题的,你代码片段里的写法可以改用这两个生命周期方法:
attached() {
this
.timer = setTimeout(() => {
this
.setData({
comp_b_show:
true
})
}, 2000)
},
detached() {
clearTimeout(
this
.timer)
}
例子里的setTimeout只是模拟而已
真实的情况可能是
某个组件打开的时候,进行异步请求,在异步请求前用户关闭了组件 =》 报错
某个组件涉及到一个值,而这个值可能是全局或者异步的,导致一旦组件显示过,那么只要组件关闭 =》 报错
主要是涉及到了wxml,导致其他代码也不能运行下去
所以,希望的是
错误只在js里进行报错,不涉及wxml
wx:if支持不同类型的值?(原理不清楚,只能猜测由于wxml也是转成js执行,而wx:if判断了传入值,导致报错)
那这种情况你应该在A的父组件/页面来判断B,网络请求回来如果发现A都没了,B肯定也就不用渲染了
是的,所以我的临时方法就是在B组件去判断(wx:if="{{b_inst_shiw}}")B组件是否存在
但这样有点不太友好?一旦涉及多层就得这样写兼容
就是希望可以
不影响wxml的显示,wx:if的值默认为undefined也行,现在是直接不能继续了
不报这个错,而是在js里报错说明那个值没有
我先来一个临时的解决办法吧
既然我们知道如果CompB的wx:if判断时候CompA已经卸载了,那么就会出现Bug。
那我们就可以在CompB的wx:if里多一个判断,判断CompA是否被卸载
如何判断?
只要在CompA的attached生命周期和dettached生命周期里设置一个开关就行,亲测可以临时解决
更粗暴一点?
如果CompA有引用组件,组件的父层(不限层级)有wx:if
那么,我们在CompA的最顶层进行判断就可以
只不过,作为临时方法,非常的不友好