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

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

二、分析:

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

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

你可能感兴趣的:(微信小程序)