Lin-Ui 之 Button 组件源码分析

871 阅读4分钟

  hello,大家好,不知道大家对lin-ui用的是否熟悉呢?最近要开发小程序,在选型上我决定用lin-ui这个组件,感觉还不错,接下来,我会带领大家去分析其中的一个组件,Button组件。

      首先,我们需要去到Lin-Ui 官方文档去分析这个组件有什么的功能,网址是doc.mini.7yue.pro/component/b…,入下图:


然后我们需要把源码下载下来,在这个网页上:


下载完源码之后,打开代码,如下图:

       注意了,是dist目录下面,就是源码所在地,当上面的一切你都准备好,我们就开始分析组件吧!

首先我们来看一下wxml 文件如下图:

      注意了,是dist目录下面,就是源码所在地,当上面的一切你都准备好,我们就开始分析组件吧!

     首先我们来看一下wxml 文件如下图:

     当打开这个文件的时候,我的第一反应,哎?怎么那么奇怪,为啥会有两个标签,button是不用说的,那么label是干嘛用的呢?经过一系列的查证,发现label 元素不会向用户呈现任何特殊效果。不过,它为鼠标用户改进了可用性。如果您在 label 元素内点击文本,就会触发此控件。就是说,当用户选择该标签时,浏览器就会自动将焦点转到和标签相关的表单控件上。 也就是说它就会聚焦到button组件上面,在这个过程通过了label这个标签进行一个通话筒功能,另外<label> 标签的 for 属性应当与相关元素的 id 属性相同。这就像是那条电话线一样。

     OK,上面已经说明白了label标签和button之间的内在关系,那么他们的外在关系是什么呢?不知道大家有没有注意到,如下两图:



       从这里我们可以看到他们之间的关系,label里面有个容器是相对定位的,而真正的button是绝对定位的,而且还被用火箭送上了宇宙,连个面都见不着,这就尴尬了,这样子搞,怎么设置按钮的样式啊?

答案其实已经写在了上面,在label里面的那个容器其实已经给了它设定了样式了,如下图:


看到这些,我觉得异常熟悉,大家有没有一种似曾相识的感觉?请看下面:



其实这些就是外部传进去的属性参数,而在js中是需要这样的设定的:


      这里面他们都有默认值,这就为什么官方文档里面都说你不设定也会有东西处理的原因了,感慨一下,一切皆是命中注定?,屁话,前人栽树而已。。。。。。

     OK,讲到这里,不知道大家有没有发现我的一个讲解的思路呢,先从文档入手,再看xwml代码,分析它的架构,再瞧一下他的样式,最后根据wxml给我的线索再看js逻辑,总的来说,分析问题,思路从哪里开始,怎么开始,很重要哦!

     看完上面你以为分析玩了吗?傻瓜,还有一个很不错的点呢,都说有js逻辑的组件是霸道的,因为你先设置了方法,那别人用你的组件的时候,还怎么操作,而这个组件是怎么做到js方法的兼容的呢?请看下面:



      这里的话我们需要看一下小程序的官方文档,你会发现this.triggerEvent 这个语法,他的意思就是给你一个途径去获取外面的事件,而在这里他的事件名称是 lintap ,也就是


        这里了,所以在源码上的东西和文档是一一对应的,所以我们在使用的时候才可以假设是这样: 

<l-button bind:lintap="handleClickItem" >

      如上图,有没有注意到我的蓝色框,在这里的沿用微信button原生的开放功能的时候代码是这样的:


       同样的语法糖,但是不同的用法,大家好好琢磨一下,这里面的data变量是什么呢?如果我问你,你会怎么解决这个问题? 如果是我的话,我会改他的源码,console 一下这个data出来,啥子都明白了,但是我没有这么做,因为我写这个的目的是为了把他设计组件的思路写出来:总的来说就是通过 把label和button关联起来,把样式写到label标签里面的容器上面,然后功能继续沿用button的所有功能,这种的关系就像是明星和他的经纪人之间的关系

最后,我把我分析的代码贴出来:




总结:我们在懂得怎么用同时,更应该懂得为何能用,这是对开发这两个字最大的尊重。