微信小程序selectComponent返回null的问题排查与分析-程序员宅基地

技术标签: 自定义组件引用为null  selectComponent返回unll  selectComponent  自定义组件  小程序  

       要想小程序界面好看,还原UI妹纸设计的界面,小程序自带的组件肯定是无法满足所有需求的。那想要还原比较炫酷好看的UI的时候就必不可少需要自定义组件了。写过许多自定义组件了,也遇到过许多坑,这里说一个比较头大的坑,就是引入自定义组建的时候,使用selectComponent获取自定义组件对象时,返回null的问题。

      简单示例

   因为这里我们说的主要是selectComponent返回为null的问题,其他问题先不考虑,这里假设我有一个自定义组件QrCodeDialog,且自定义组件的代码没有问题(组件代码本身的问题就不在本次讨论范围了)。

这个时候我在Main界面引用了QrCodeDialog,却发现this.selectComponent()方法返回的null。

问题排查与分析

  1.那首先最基本的就是看页面的json引用路径是否正确

2.看看wxml文件里面的选择器是否设置选择器,比如我这里设置的是id选择器

(这里提一下自定义组件使用什么名字的标签是由页面的json文件中引用自定义组件时的key决定的,比如我引用的时候key定义的是qrcode_dialog,那么在wxml文件使用的时候组件名就是qrcode_dialog,这个大家应该都知道^_^)

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

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

 

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

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

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

 

    说到这个区别我想有些小可爱已经明白了。假如你的自定义组件包裹在了wx:if下,并且在你使用selectComponent获取组件对象的时候,这个wx:if的条件还为false,也就是说你引用的时候,页面并没有渲染到你的自定义组件,这时候使用selectComponent获取的组件对象当然为空,因为都还没渲染到。

举个简单的例子:

wxml文件

<view wx:if="{
   {a==1}}">
   <qrcode_dialog id="vipQrcode1" />
</view>

qrcode_dialog 是我的自定义组件,使用view包裹,并使用wx:if添加条件如果a==1就显示

js文件添加引用代码

    this.vipQrcode1 = this.selectComponent("#vipQrcode1")
    console.log("第一次---this.vipQrcode1====", this.vipQrcode1)
    this.setData({
      a:1
    })
    this.vipQrcode1 = this.selectComponent("#vipQrcode1")
    console.log("第二次--=this.vipQrcode1====", this.vipQrcode1)

这里我先直接引用一次,打印一次日志,再看看赋值a为1之后再引用打印一次日志,看看效果:

很显然第一次的时候由于不满足a==1的条件,selectComponent返回的是null,当我赋值了a=1时,这时候满足了if条件,我再次引用就不为空了。

我们在将wx:if换成hidden看看有什么区别,只需要改下wxml文件的代码:

<view hidden="{
   {a!=1}}">
  <qrcode_dialog id="vipQrcode1" isShow="{
   {false}}" />
</view>

hidden的条件就是a!=1就隐藏,js还是之前的代码,先直接引用一次,打印一次日志,再赋值a为1之后再引用打印一次日志,我就不贴了,再看看日志

很显然当我换成了hidden之后,无论是否满足条件selectComponent都不为空。

   说到这里,赶紧看看你页面的wxml文件的布局文件,是不是将自定义组件放在了wx:if里面包裹起来了,并且你引用的时候wx:if的条件是不是为false。如果真的是这种情况导致的就将wx:if换成hidden就好了。

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

       这个意思就是说你的自定义组件嵌套在n个view下面,理论上页面渲染的顺序应该是从外往里,如果你的自定义组件嵌套的非常深,而这个时候你在页面还未渲染完成的时候就开始使用selectComponent引用组件,获取到的对象也有可能是会为null,这个情况不会太稳定,有时候渲染的速度不一样,出现偶尔引用成功,偶尔引用失败的情况。当然这种情况极少出现,反正我这辈子没遇见过。哈哈~夸张了一些,反正我是没遇到过这种情况,不过理论上应该是存在这种情况的。如果真的遇到了这种情况,你可以没必要急着一开始就去引用它,你也可以延迟几秒钟再引用,或者在你需要使用自定义组件里的方法时再引用。

 

说了这么多,其实只要记住this.selectComponent()返回为null的情况无外乎就是两种,要么是引用错误,要么就是未找到自定义组件节点,在发现其他情况的话我在补充。

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_36611526/article/details/103719036

智能推荐

windows使用libvlc进行网络串流遇到的一些问题及解决方法_libvlc网络-程序员宅基地

文章浏览阅读857次。windows使用libvlc进行网络串流遇到的一些问题及解决方法_libvlc网络

ffmpeg--libswscale(图像缩放、颜色空间和像素格式转换操作)-程序员宅基地

文章浏览阅读1k次。主要函数:(1) sws_getContext():使用参数初始化SwsContext结构体。 可以用另一个接口函数sws_getCachedContext()取代。(2) sws_scale():转换一帧图像。(3) sws_freeContext():释放SwsContext结构体。初始化方式2种:①sws_getContext②sws_al..._libswscale

Python#Flask#Mysql水质监测预警系统10148-计算机毕业设计(附源码)_水位在线监测预警系统开发-程序员宅基地

文章浏览阅读178次,点赞3次,收藏2次。本系统前端部分基于MVVM模式进行开发,采用B/S模式,后端部分基于python的Flask框架进行开发。前端部分:前端框架采用了比较流行的渐进式JavaScript框架Vue.js。使用Vue-Router和Vuex实现动态路由和全局状态管理,Ajax实现前后端通信,Element UI组件库使页面快速成型,项目前端通过栅格布局实现响应式,可适应PC端、平板端、手机端等不同屏幕大小尺寸的完美布局展示。后端部分:基于python语言以Flask作为开发框架,同时集成Redis,Echarts等相关技。_水位在线监测预警系统开发

wxpython,窗口,控件,事件_wxpython 调用窗口控件-程序员宅基地

文章浏览阅读2.3k次。介绍一个python的图形化界面,wxpython。 wxpython是Python语言对流行的wxWidgets跨平台GUI工具库的绑定。而wxWidgets是用C++语言写成的。 wxPython是跨平台的。这意味着同一个程序可以不经修改地在多种平台上运行。现今支持的平台有:32/64位微软Windows操作系统、大多数Unix或类Unix系统、苹果Mac OS_wxpython 调用窗口控件

PanDownload复活了!60MB/s!-程序员宅基地

文章浏览阅读405次。(软件下载方式在文末)自从 PanDownload 被处理之后一直没有超越它的可替代的应用出来但是最近,竟然有人接盘了!重新制作上线推出了更加强劲的复活版!放张图,大家先感受下60MB/..._.较好的容灾处理(眼神暗示)

俺也来祭祭熊猫-程序员宅基地

文章浏览阅读5.2k次。最近熊猫烧香肆虐,WC里CIM那群人集体中招,俺的机子裸奔竟然也没事,呵呵。刚好python的邮件列表上有人给“熊猫”玩文字游戏,觉得特有意思,拿出来和大家分享一下 。 床前明月光,熊猫在烧香。专杀杀不尽,两眼泪汪汪。 熊猫烧不尽,关机开又生。   宝剑锋从磨砺出,熊猫香自网上来。   无边香火烧烧下,不尽熊猫滚滚来。身心俱疲终不悔,为猫烧得人憔悴。 相见时难杀亦难,熊猫烧

随便推点

Docker快速搭建Jaeger开发环境(Docker 部署Jaeger all-in-one)_docker 部署jaeger 部署-程序员宅基地

文章浏览阅读6.4k次。通过Docker 快速搭建Jaeger 本地测试、开发联调环境。_docker 部署jaeger 部署

Kotlin中的@Metadata-程序员宅基地

文章浏览阅读8.3k次,点赞2次,收藏7次。本文简单介绍了下注解Metadata各个字段的含义及其与反射的关系。Kotlin 允许我们对各种 Kotlin 的语法特性进行访问,不过,这里应该有一个问题没有搞清楚:既然 Java 反射对于 Kotlin 的很多特性都无法访问和识别,换句话说,Java 虚拟机也是无法知道他们的,那么 Kotlin 的反射是如何做到这一点的呢?这实际上主要是得益于kotlin.Metadata这个..._@metadata

深入理解Android音视频同步机制(五)如何从零开始写一个音视频同步的播放器_getplaybackheadposition-程序员宅基地

文章浏览阅读1.1w次,点赞6次,收藏31次。前面我们分析了三个播放器的av sync逻辑,可以看到他们都各有不同,那么究竟哪种方法可以达到最好的avsync结果?哪些逻辑是必要的?如果我们想自己从零开始写一个av同步的播放器,都需要做哪些工作?本文通过一个demo解答上面的问题_getplaybackheadposition

linux 磁盘盘符改变,硬盘盘符重启后 自动切换——根据UUID挂载磁盘-程序员宅基地

文章浏览阅读997次。[root@platform-103 ~]# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTvda 252:0 0 60G 0 disk├─vda1 252:1 0 500M 0 part /boo..._linux重启后盘符交换

数据结构与算法详解——散列表篇(附c++实现代码)_设计算法,将数组a 进行散列存储,以解决-程序员宅基地

文章浏览阅读1.8k次,点赞3次,收藏15次。目录散列表散列函数哈希冲突开放地址法线性探测二次探测双重散列链表法装载因子散列表  前面数组、链表、栈、队列都是序列式容器,存储的都是一个元素。而散列表又叫哈希表(hash table),是一种关联式容器,存储的是一对值,一般是一个key对应一个value(又叫键值对)。  c++ stl中的map就是一个散列表,举个例子:std::map<std::string,int> m;m["小明"]=170;std::cout<<"小明的身高是"<<m["小明"]&_设计算法,将数组a 进行散列存储,以解决

域名讲解(一)域名基础概念-程序员宅基地

文章浏览阅读8k次,点赞4次,收藏26次。它作为可以将域名和IP地址相互映射的一个分布式数据库,是进行域名(domain name)和与之相对应的IP地址 (IP address)转换的系统,搭载域名系统的机器称之为域名服务器,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP地址数串。,并通过网域名称系统(DNS,Domain Name System)来将域名和IP地址相互映射,使人更方便地访问互联网,而不用去记住能够被机器直接读取的IP地址数串。对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。..._域名

推荐文章

热门文章

相关标签