内容简介:如何写一个微信小程序组件
背景
先谈下背景,在做一款产品的时候需要用到日期选择器,但是官方的却不太满足需求,因为无法选择农历啊。所以自己来造一个轮子好了,造轮子之前先想想啊,万一以后多个地方要用到,多个项目要用,怎么办呢?
那把这个轮子抽象,定义输入输出,即接口。组件里面怎么运转调用方不管啊,给了什么输入,就只管结果好了。
组件三要素
组件的三要素就是小程序定义的三种文件:
- js
- wxml
- wxss
因为js本身就是模块化开发,所以这天然有利于组件化。wxml和wxss呢,定义了组件的皮肤,小程序的模板template标签可以方便wxml的复用。至于wxss,没有独立出来,目前没发现要怎么整合到独立的组件中去,而不与其他的wxss发生耦合。
<!-- index: int msg: string time: string --> <template name="myTemplate"> <view> <text> {{index}}: {{msg}} </text> <text> Time: {{time}} </text> </view> </template>
用法
// 如果模板是写在单独的wxml文件,则要inport,引入。路径则是当前文件的相对路径。 <import src="../cal/calendar.wxml"></import> <template is="myTemplate" data="{{...item}}"/>
需要注意的是data数据是有单独的作用域的,只能使用data传入的数据。具体的理解就是:
data: { item: { index: int msg: string time: string }, index: int msg: string time: string }
模板里面的数据实际显示的是item的属性,而不是和item同级的属性。
模板还有一种用法
<template is="myTemplate" data="{{index,msg,time}}"/>
这样就要传入模板中用到的三个变量,而不是item一个对象。模板渲染的结果则是最外层的index属性,而不是item的index属性值。
…符号是扩展运算符,理解为将一个对象所以的属性展开传递给模板,这样的好处是不要传递多个,写出的代码更加简洁。扩展运算符是ES6的特性,有兴趣可以 深入学习 。
如果运用扩展运算符给模板传入数据,像上面怎么去更新单个key的值呢?小程序提供了可以根据属性路径更新的方法:
// 更新单个key, this.setData({ index: 1 }); /* 更新对象中的单个key item: { index: int msg: string time: string } */ this.setData({ 'item.index': 1 }); // path必须是字符串,不能是变量替代。下面是不行的 path = 'item.index'; this.setData({ path: 1 });
虽然用法上是有点限制,但也避免了传入一堆的参数给模板。
值得注意的是入参data的item必须是有初始化值,否则会报错。
日历组件
所以利用template和js就可以打造一款组件了。先看下我所做的组件:
定义一个wxml文件
<template name="calendar"> ... </template>
定义一个js文件
class Calendar { ... }
日期类有自己的作用域名,所以组件内部的事件导致数据更新的时候,还是要用页面更新数据的方法this.setData,所以必须要将页面对象传递给组件内部。
页面调用组件:
// this 是当前页面page对象,含有setData方法。 var calendar = new Calendar(this, function(date) { that.setData({ date: date }) }); // 当选择日期变化的时候,组件内部事件: this.pageCtx 则是page上下文,即上面实例化组件入参的this对象。 changeCalendarTab(e) { this.pageCtx.setData({ 'calendar_data.selectDateType': +e.target.dataset.tap }); this.data.selectDateType = +e.target.dataset.tap; this.changeCallBack && this.changeCallBack(this.getCurrentSelectDate()); }
具体组件请参考我的github: calendar 。
这样就完成了一个组件编写,任何需要用到的地方都可以引入了。小程序一个不太好的地方是没有包管理的概念,导致跨项目见的公共模块复用起来比较麻烦,下次进行单独讲解。
以上所述就是小编给大家介绍的《如何写一个微信小程序组件》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 「小程序JAVA实战」小程序开源搜索组件(52)
- 简单-定义一个小程序组件
- 「小程序JAVA实战」小程序视频组件与api介绍(50)
- 微信小程序倒计时组件
- 小程序档案馆——自定义组件
- 小程序 - 验证码倒计时组件
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
网页设计创意书(卷2)
麦克尼尔 / 图灵编辑部 / 人民邮电 / 2012-1 / 49.00元
《网页设计创意书(卷2)》是《网页设计创意书》的卷2,但并非其简单补充,而是作者基于近几年网站发展新趋势的再创作。《网页设计创意书(卷2)》先讲解了如何从他人的优秀设计中寻找灵感,接着阐述了重点、对比、平衡、对齐等网站设计的基本原则,然后将网站按类型、设计元素、风格和主题、结构样式和结构元素分类,并分章介绍了每一类的设计技巧。《网页设计创意书(卷2)》语言简练,结合作者精挑细选的网站实例,通俗易懂......一起来看看 《网页设计创意书(卷2)》 这本书的介绍吧!