微信小程序官方提供的checkbox有点丑,于是就写了这个。
思路:
1.checkboxGroup里包着一个checkbox view组件
2.每个checkbox里都包含一个icon与text
3.icon与text点击都会选中,类似于label for的用法,icon样式会切换状态。normal与highlight状态,对应的值赋予icon的type属性。
4.每个checkbox的view都有一个value属性与text属性,分别对应实现值与字面显示,只转递前者作为数据交互。view设定2个属性,data-value与data-text。
5.每次点击都会将checkbox的value值存在到checkedValues数组中
步骤:
- 设置布局,使用文字与图标垂直居中,左间距4px,每个独占一行。
布局文件
- <!-- CheckboxGroup容器 -->
- <view class="lxCheckboxGroup">
- <view wx:for="{{items}}">
- <icon type="{{item.type}}" data-value="{{item.value}}" size="20" bindtap="bindCheckbox"/>
- <text>{{item.text}}</text>
- </view>
- </view>
样式表
- /*整个复选框组容器*/
- .lxCheckboxGroup {
- width: 80px;
- height: 26px;
- margin:20px auto;
- }
- /*单个复选框容器*/
- .lxCheckboxGroup view {
- /*上下间距4px*/
- margin: 4px auto;
- }
- /*复选框图标*/
- .lxCheckboxGroup icon {
- /*text用block描述,所以要左浮动*/
- float: left;
- }
- /*文字标签样式*/
- .lxCheckboxGroup text{
- font-size: 14px;
- /*20px是左按钮的大小,4px是真实的左间距*/
- margin-left: 24px;
- /*高亮与icon相等,实现垂直居中*/
- height: 20px;
- /*文本垂直居中*/
- line-height: 20px;
- /*块布局,否则文本高度无效*/
- display: block;
- }
js代码
- Page({
- data: {
- items: [
- {value: 'USA', text: '美国', type: 'circle'},
- {value: 'CHN', text: '中国', type: 'success_circle'},
- {value: 'BRA', text: '巴西', type: 'circle'},
- {value: 'JPN', text: '日本', type: 'circle'},
- {value: 'ENG', text: '英国', type: 'circle'},
- {value: 'TUR', text: '法国', type: 'circle'},
- ]
- },
- bindCheckbox: function(e) {
- //绑定点击事件,将checkbox样式改变为选中与非选中
- console.log('s' + e.currentTarget.dataset.value);
- }
- })
如图
- 响应点击事件
2.1 利用e.currentTarget.dataset.index传checkbox的index值,作点选与非点选操作,并将已选的values值单独存到数组checkedValues中,供返回提交等操作。
- bindCheckbox: function(e) {
- /*绑定点击事件,将checkbox样式改变为选中与非选中*/
- //拿到下标值,以在items作遍历指示用
- var index = parseInt(e.currentTarget.dataset.index);
- //原始的icon状态
- var type = this.data.items[index].type;
- var items = this.data.items;
- if (type == 'circle') {
- //未选中时
- items[index].type = 'success_circle';
- } else {
- items[index].type = 'circle';
- }
- // 写回经点击修改后的数组
- this.setData({
- items: items
- });
- // 遍历拿到已经勾选的值
- var checkedValues = [];
- for (var i = 0; i < items.length; i++) {
- if (items[i].type == 'success_circle') {
- checkedValues.push(items[i].value);
- }
- }
- // 写回data,供提交到网络
- this.setData({
- checkedValues: checkedValues
- });
- }
- text也需要绑定bindCheckBox事件,产生label for的效果,但还可以更简单的处理,就是把事件绑在容器view上,这样点击更直观。
如下面代码:
- <!-- CheckboxGroup容器 -->
- <view class="lxCheckboxGroup">
- <view wx:for="{{items}}" data-index="{{index}}" size="20" bindtap="bindCheckbox">
- <icon type="{{item.type}}" size="20"/>
- <text>{{item.text}}</text>
- </view>
- </view>
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。
相关文章
-
微信小程序 轮播图 swiper图片组件
2016-11-23 09:49
-
微信小程序 开发 微信开发者工具 快捷键
2016-11-23 09:49
-
微信小程序 页面跳转 传递参数
2016-11-23 09:49
-
微信小程序 如何获取时间
2016-11-23 09:49
网友点评
热门资讯
关注我们
关注微信公众号,了解最新精彩内容