小程序使用selectComponent获取自定义组件时,返回null(分析和解决方法)

一、原因:
       组件所在的布局层级不同,该组件被创建的时间会有所不同,意味着ready(组件生命周期函数,组件布局完成后执行)被调用的时间有所不同。由于组件创建完成的时间晚于页面创建完成,即组件生命周期函数的ready被执行的时间晚于页面生命周期函数的onReady,无论在页面生命周期的onLoad函数还是onReady函数中,组件还没有创建完成就使用selectComponent去获取,自然获取结果为null。

二、分析:

       首先,看一下页面生命周期函数onReady,官方解释是“页面初次渲染完成时触发。一个页面只会调用一次,代表页面已经准备妥当,可以和视图层进行交互。”。这里我有点困惑,“初次渲染完成”是不是指页面首次将所有组件渲染完成?从第二句话中“页面已经准备妥当,可以和视图层进行交互。”也应该是说明了这点,但实际在使用自定义组件时,只有组件位于第一层级才会先于页面的onReady函数调用组件的ready函数,否则,组件所在的层级深度将直接影响到组件创建完成的时间,通常会晚于页面的onReady函数,当然,有时也会早于。这就是为什么有些人说获取组件实例不稳定,在有些页面可以获取,有些页面就可以,偶尔可以,偶尔又不行,在不同页面可能该组件的布局层级不同,且运行环境性能不稳定,导致组件实际布局完成时间有所延迟。
三、解决方法:
       在使用selectComponent函数获取组件实例时,应使用setTimeout函数适当延时,或者在页面交互事件中获取。保守点可以采用递归的方法去获取该组件实例,获取后判断是否已经取到,没有重试。

注:如果不是该问题导致,可能是哪里编码遗漏或错误(例如组件id不一致等),请认真检查代码,如有其他问题可以评论询问。

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Homilier

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值