微信小程序:selectComponent返回null的问题

当小程序自带的组件无法满足所有需求的时候,我们可以参考很多自定义组件。我们这次排查问题就拿比较常用的vant-weapp作为示例:使用selectComponent获取自定义组件对象时,返回null的问题

1、json引入组件

复制代码
"usingComponents": {
  "van-button": "@vant/weapp/button/index",
  "van-count-down": "@vant/weapp/count-down/index"
}

2、看看wxml文件里面的选择器是否设置选择器

复制代码
<view>
    <van-button plain hairline type="primary" wx:if="{{isShowCountDown}}" >
        <view>获取验证码</view>
    </van-button>
    <van-button plain hairline type="primary" wx:if="{{!isShowCountDown}}" >
        <view class="flex-start">
            <view>
                <van-count-down class="control-count-down" millisecond time="{{ time }}" auto-start="{{ false }}" format="ss"/>
            <view>
            <view>秒后重新获取验证码</view>
        </view>
    </van-button>
</view>

3、看看在页面的js文件里面引用的代码

复制代码
let _this = this;
const countDown = _this .selectComponent('.control-count-down');
console.log("countDown >> " + countDown );

注意这个selectComponent方法里面的参数要与wxml里面设置的class选择器的值相对应,比如我的用的class选择器就用点+class名称

如果检查过后上面说的,全都没问题的话,那多半就是wxml中自定义组件的那段代码还没渲染到就使用selectComponent引用了组件,这个时候的返回值null。产生这种大致就下面两种情况

1、wx:if属性使用不当。

这里不得不提一下wx:if与hidden属性的区别,这两个属性我想大家都比较熟悉,都是用来控制显示与隐藏的。要说有什么区别,有些可爱的同学就会脱口而出:"wx:if条件为true就显示,反之则隐藏;hidden条件为true就隐藏,反之则显示!"。嗯,说的没错,这确实是最直观最明显的区别。但是说的并不全!他们还有一个区别,就是如果你用wx:if包裹了一段代码,界面在渲染的时候,当wx:if的条件为false的时候是不会渲染这段代码的,只有wx:if的条件为true才会渲染这段代码;而用hidden包裹的代码无论条件是为true还是false都会渲染它包裹的代码,只不过为true时将这段布局隐藏了而已。

2.自定义组件所在层级太深

如果你的自定义组件嵌套的非常深,而这个时候你在页面还未渲染完成的时候就开始使用selectComponent引用组件,获取到的对象也有可能是会为null,这个情况不会太稳定,有时候渲染的速度不一样,出现偶尔引用成功,偶尔引用失败的情况

以上情况分析,我们将我们代码优化了下

复制代码
<view class="flex-start">
    <view hidden="{{!isShowCountDown}}">
        <van-count-down class="control-count-down" millisecond time="{{ time }}" auto-start="{{ false }}" format="ss" bind:finish="onCountDownFinished" />
    </view>
    <view wx:if="{{isShowCountDown}}" class="phone-code-get"> 秒重新获取</view>
    <view wx:if="{{!isShowCountDown}}">获取验证</view>
</view>

这样之后正常获取了~~~~

其实只要记住_this.selectComponent()返回为null的情况以上两种,要么是引用错误,要么就是未找到自定义组件节点。

相关推荐
m0_462803881 天前
【无标题】
微信小程序
小码哥0681 天前
从三甲综合医院到连锁诊所:医院管理小程序的场景化突围逻辑(陪诊系统-陪诊APP-陪诊小程序)
小程序·医院管理系统·陪诊小程序·陪诊系统·陪诊app
2501_916007471 天前
iOS和macOS应用程序性能分析和优化工具使用综合指南
android·macos·ios·小程序·uni-app·iphone·webview
正在走向自律1 天前
用豆包Seed Evolving打造全功能【AI智能记账】小程序,开源可落地
人工智能·小程序·开源·智能记账
小羊Yveesss2 天前
模板建站哪个平台好?模板数量之外还要比较编辑与SEO能力
大数据·人工智能·小程序
2501_916007472 天前
深入理解HTTPS对称与非对称加密机制及Charles抓包实践
网络协议·http·ios·小程序·https·uni-app·iphone
郑州光合科技余经理2 天前
家政O2O平台解析:从0搭建上门预约小程序解决方案
android·java·开发语言·前端·小程序·架构·php
维双云2 天前
小程序商城制作一个需要多少钱?2026报价明细与成本拆解
小程序
郑州光合科技余经理2 天前
家政预约小程序后端源码深度剖析:支付回调实战
java·开发语言·前端·git·小程序·架构·php
电商API_180079052472 天前
导购比价小程序场景|京东联盟商品详情对接方案|多规格图文拉取技术实操
网络·小程序·网络爬虫