[string global_cpnav_top]
设为首页收藏本站[string global_cpnav_extra1]
[string global_cpnav_extra2]切换到窄版

 找回密码
 立即注册
[string global_login_extra]

扫一扫,极速登录

搜索
[string global_header]
[string viewthread_top]
返回列表 发新帖[string viewthread_postbutton_top]
[string viewthread_beginline]
查看: 918|回复: 0

技术课 | 减少重复开发,小程序自定义组件来给大家减负了

[复制链接] [string viewthread_title_extra]
[string viewthread_title_row]
[array viewthread_avatartop/0]
[array viewthread_avatar/0]
[array viewthread_sidetop/0][array viewthread_sidebottom/0]
admin 未绑定微信 发表于 2018-5-7 19:25:39 | 显示全部楼层 |阅读模式 [array viewthread_postheader/0]
[array viewthread_posttop/0]
                                                                                                   
9a09762a9415a95bd51e8fd7e4498634.gif
据说小程序开发者都有一个雄心壮志:要开发一个简洁又丰富、低调又牛气的小程序。
然而在开发较为复杂的小程序过程中,却遇上了一些难题:
一些通用的交互模块,比如“下拉选择列表”、“搜索框”、“日期选择器”等,可能会在多个页面中用到,逻辑也相对独立,但用传统的小程序开发方法来实现这些模块却又非常繁琐。
面对这个难题,本期小程序课特意找了微信开发哥来为大家支招,分享让小程序避免重复、繁琐的开发好方法。

小程序的界面是由一系列组件构成的。小程序基础库提供了一组基础组件来满足开发者的基本需求。但随着小程序开发变得越来越复杂,单纯使用基础组件来进行开发也变得越来越不方便。
对此,小程序基础库提供了让开发者自己创建界面组件的特性,称之为“自定义组件”。通过这个特性,开发者就能够将这样的交互模块抽象成界面组件,使界面代码组织变得非常灵活。

01
7a666a5b8ace4a6224cfed983355e182.png 开发者可以将一些复用性强的代码抽象成自定义组件,它们的使用方法与基础库内置的 view 、 button 等基础组件非常相似。这样的组件化非常有利于代码逻辑的解耦合。
02
自定义组件局部更新时的性能相比页面的局部更新要小很多,在必要时可以利用这个特点进行性能优化。
03
自定义组件是相对独立的功能模块,开发者可以将自己的自定义组件代码开源出来,与其他开发者共享开发成果。
如何编写一个自定义组件?
每个自定义组件由四个代码文件组成:

  json文件    用于放置一些最基本的组件配置
  wxml 文件    组件模版
  wxss 文件    组件的样式,只在组件内部节点上生效(这个文件是可选的)
  js 文件   组件的 JS 代码,承载组件的主要逻辑
这四个文件与编写一个页面时用到的四个文件非常类似,但也有区别。下面将介绍如何利用这四个文件编写一个简单的自定义组件。
1组件配置
编写一个自定义组件,首先应在小程序代码目录中合适的位置创建一个 json 文件。这里我们把文件放置在小程序的 components 目录下,名为 custom-checkbox.json 。

62039dcd7c0f7db6df3fd07051608dc8.png
这个文件中包含以下内容:

21a33fbbcc3f94f6bc6d0a8c236aa03c.png
2组件模板
在同一目录下,创建一个模版文件 custom-checkbox.wxml 。这个文件的写法与页面模版很类似:


55888532103d3d1a3099e4b7521eb376.png
这个模版将在组件中渲染出一个 checkbox 和一个 label 。
3组件样式
同样类似于页面, wxss 文件中可以指定组件节点的样式。其中的样式仅在组件内部生效。需要注意的是,样式只能通过类选择器(如 .the-class-name )来指定:

264b04cddc11821c333799d94b31dae8.png
4组件定义
组件的 JS 文件中必须包含组件定义。定义时使用 Component 构造器:

8ae3943a5082c50ac47811e27c13697b.png
简单的 Component 构造器调用包含3个定义段:
methods 中的方法可以用来包含组件的事件回调函数;
data 是组件的内部数据,可以用 this.setData 方法来改变;
properties 中声明这个组件的属性,上例中声明了 title 属性,这样,组件外部在使用组件时就可以指定这个属性的值。
这样我们就编写好了 custom-checkbox 这个组件。
如何使用自定义组件?
使用上面这个自定义组件的方法很简单。
1Step 1
在需要使用这个组件的页面所对应的 json 文件中,添加下面的自定义组件声明:

b91d6210b3c9c37dc9aece211cbc393b.png
2Step 2
在页面对应的 wxml 文件中使用了:

a48ecd2293977c3d050a48a688680be2.png
这样,在页面上最终呈现的效果如下:

9e36bbe72041d2e109c5c37f424e28cc.png
在自定义组件中也是可以引用其他自定义组件的,方法与在页面中引用的方法类似。
高级特性与注意事项
除了上述的基本功能外,自定义组件还提供了一组基础接口,用来实现各种各样的功能。
01
在页面和自定义组件间通信时,最常用的方法是事件机制,自定义组件可以使用 triggerEvent 接口向页面发送事件,页面 WXML 中使用 bind 或者 catch 就可以监听到。
02
如果事件机制还不足以满足组件间通信需要的话,可以使用selectComponent 接口。
03
如果同时建立了好几个有相互关联关系的组件,可以使用组件间关系接口 relations 。
04
组件间可能需要共享部分代码,这时可以使用 behaviors 。
有关它们的详细文档,请参考 开发者文档 - 框架 - 自定义组件 章节。
还需要注意的是,一些与 WXML 节点相关的接口,如wx.createSelectorQuery  、 wx.createCanvasContext ,在自定义组件中使用时有一定的变化,使用时请再次阅读一下相关的文档。

如果本期内容让你有所收获欢迎赞赏一下我们的开发哥
abf7d5108d8a569644fa408f88e0cac5.jpg
课后交流了解完本期的小程序自定义组件知识后,你还想了解小程序的哪些能力?
欢迎在评论区留言,用孜孜不倦的求学精神“召唤”微信开发哥吧!
● 内容来自“微信开发者”公众号《小程序·小故事》栏目
微信公开课微信ID:wx-gongkaike
f14ac6b2a5eece9f47f1feb4d999b01b.png 1.点击历史信息,查看更多内容2.长按右侧二维码,关注微信公开课
2cf4fa13c6d947f017f82d977fcbd2f6.png 长按二维码关注
               
9a09762a9415a95bd51e8fd7e4498634.gif
7a666a5b8ace4a6224cfed983355e182.png
7a666a5b8ace4a6224cfed983355e182.png
7a666a5b8ace4a6224cfed983355e182.png
62039dcd7c0f7db6df3fd07051608dc8.png
21a33fbbcc3f94f6bc6d0a8c236aa03c.png
55888532103d3d1a3099e4b7521eb376.png
264b04cddc11821c333799d94b31dae8.png
8ae3943a5082c50ac47811e27c13697b.png
b91d6210b3c9c37dc9aece211cbc393b.png
a48ecd2293977c3d050a48a688680be2.png
9e36bbe72041d2e109c5c37f424e28cc.png
7a666a5b8ace4a6224cfed983355e182.png
7a666a5b8ace4a6224cfed983355e182.png
7a666a5b8ace4a6224cfed983355e182.png
7a666a5b8ace4a6224cfed983355e182.png
abf7d5108d8a569644fa408f88e0cac5.jpg
f14ac6b2a5eece9f47f1feb4d999b01b.png
2cf4fa13c6d947f017f82d977fcbd2f6.png
7a666a5b8ace4a6224cfed983355e182.png
7a666a5b8ace4a6224cfed983355e182.png
7a666a5b8ace4a6224cfed983355e182.png
7a666a5b8ace4a6224cfed983355e182.png
7a666a5b8ace4a6224cfed983355e182.png
7a666a5b8ace4a6224cfed983355e182.png
[array viewthread_postbottom/0]
[array viewthread_postsightmlafter/0]
回复 [array viewthread_postfooter/0]

使用道具 举报 [array viewthread_postaction/0]

[array viewthread_endline/0]
[string viewthread_middle]
[string viewthread_fastpost_side] [string viewthread_fastpost_content]
[string viewthread_fastpost_func_extra]高级模式 [string viewthread_fastpost_ctrl_extra]
您需要登录后才可以回帖 登录 | 立即注册 [string global_login_text] 

本版积分规则 [string viewthread_fastpost_btn_extra]

[string viewthread_bottom]
[string global_footer]

Archiver|手机版|小黑屋|粤ICP备12005776号-5|su.sseuu.com [string global_footerlink] 

GMT+8, 2026-8-4 15:31 , Processed in 0.064373 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表