微信小程序 MiniProgram
真假猕猴
2021年4月19日
事件:测试领取助力优惠券
期望:当领取优惠卷的时候,自动刷新福利中心的列表
实际:当领取完后,福利中心的列表并没有自动刷新
实现逻辑
- 在领取弹窗中,当领取完后,通过triggerEvent 反馈一个addsuccess的事件
- 主页面接收到后,调用首页(子组件)的 获取福利中心列表的方法
- 方法中,从接口获得数据,并进行setData
一切都是如此美好.....
but,福利中心列表就是没有更新视图
通过console.log 接口返回值,它是新的
that.setData后,console.log that.data 也是新的
甚至直接将整个首页子组件console.log 出来,也是新的
总之,数据是新的,就是没有更新视图
但是假如切换一下页面,然后回到首页,那么又是能更新视图的
网上说要用到setData,要用that.setData,不要用this.setData,setData的数据不能大于1024....
在这里均不存在....
网上还说可以调用子页面的onLoad,或者onReady,进行更新视图
这里用的是组件,不论调用onLoad,onReady,load,ready 均提示没有找到方法no function ....
既然不更新视图,那么来一个wx:if,在获取数据之前先隐藏福利中心列表,获取完后,再显示出来
没有效果....
猜测是不是因为方法是promise,但是没有同步执行导致
继续失败....
问题已经困扰了一上午......
灵感总是在不经意间
addsuccess 事件的处理方法中,刷新福利中心列表的代码段如下
// 重新加载福利中心的显示内容
await this.vipCardIndex.getCouponActivities();
this.vipCardIndex 这个,是在页面onLoad的时候通过selectComponent设置的
this.vipCardIndex = this.selectComponent("#vipCardIndex");
现在看到的这个首页组件,跟onLoad里获取的这个首页组件,会不会不是同一个?
马上尝试下,在重新加载福利中心之前重新获取一下
// 重新使用selectComponent获取一下
this.vipCardIndex = this.selectComponent("#vipCardIndex");
// 重新加载福利中心的显示内容
await this.vipCardIndex.getCouponActivities();
一切都变得通畅,问题解决,
看到的组件和实际刷新的组件,实际不是同一个,所以不论怎么setDate,不论怎么wx:if,也不会有效果
总结
在进行组件引用的时候,最好通过重新selectComponent获取,因为在你使用它之前,也许已经不是你看到的那个。