【转】小程序实现单选多选功能

原文地址:https://www.jb51.net/article/150127.htmcss

一、模拟实现多选框:小程序

实现思路:思路很是简单,给每一个选项绑定checked属性,类型为布尔值,点击取反便可dom

?
1
2
3
4
5
6
7
8
9
10
11
<!--wxml-->
< view class = 'wrap' >
  < view class = 'checkbox-con' >
  < checkbox-group bindchange = "checkboxChange" >
   < label class = "{{item.checked?'checkbox checked':'checkbox'}}" wx:for = "{{checkboxArr}}" bindtap = 'checkbox' data-index = "{{index}}" wx:key = "item.name" >
   < checkbox value = "{{item.name}}" checked = "{{item.checked}}" />{{item.name}}
   </ label >
  </ checkbox-group >
   < button type = 'primary' bindtap = 'confirm' >提交</ button >
  </ view >
</ view >

小程序的单选组件radio和多选组件checkbox的样式只提供更改颜色,这对实际项目中的需求显然是不够的,因此本身模拟实现一个。xss

踩坑点:小程序不支持操做domthis

一、模拟实现多选框:spa

实现思路:思路很是简单,给每一个选项绑定checked属性,类型为布尔值,点击取反便可.net

?
1
2
3
4
5
6
7
8
9
10
11
<!--wxml-->
< view class = 'wrap' >
  < view class = 'checkbox-con' >
  < checkbox-group bindchange = "checkboxChange" >
   < label class = "{{item.checked?'checkbox checked':'checkbox'}}" wx:for = "{{checkboxArr}}" bindtap = 'checkbox' data-index = "{{index}}" wx:key = "item.name" >
   < checkbox value = "{{item.name}}" checked = "{{item.checked}}" />{{item.name}}
   </ label >
  </ checkbox-group >
   < button type = 'primary' bindtap = 'confirm' >提交</ button >
  </ view >
</ view >
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/* wxss */
.wrap{
  width : 550 rpx;
  margin : 50 rpx auto
}
  
.checkbox-con{
  margin-top : 40 rpx;
  text-align : center
}
.checkbox{
  width : 260 rpx;
  height : 72 rpx;
  line-height : 72 rpx;
  font-size : 28 rpx;
  color : #888888 ;
  border : 1 rpx solid #CECECE ;
  border-radius: 5 rpx;
  display : inline- block ;
  margin : 0 10 rpx 20 rpx 0 ;
  position : relative
}
.checked{
  color : #1A92EC ;
  background : rgba( 49 , 165 , 253 , 0.08 );
  border : 1 rpx solid #31A5FD ;
}
.checkbox checkbox{
  display : none
}
.checked-img{
  width : 28 rpx;
  height : 28 rpx;
  position : absolute ;
  top : 0 ;
  right : 0
}

js: code

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Page({
  data: {
  checkboxArr: [{
   name: '选项A',
   checked: false
  }, {
   name: '选项B',
   checked: false
  }, {
   name: '选项C',
   checked: false
  }, {
   name: '选项D',
   checked: false
  }, {
   name: '选项E',
   checked: false
  }, {
   name: '选项F',
   checked: false
  }],
  },
  checkbox: function (e) {
  var index = e.currentTarget.dataset.index;//获取当前点击的下标
  var checkboxArr = this.data.checkboxArr;//选项集合
  checkboxArr[index].checked = !checkboxArr[index].checked;//改变当前选中的checked值
  this.setData({
   checkboxArr: checkboxArr
  });
  },
  checkboxChange: function (e) {
  var checkValue = e.detail.value;
  this.setData({
   checkValue: checkValue
  });
  },
  confirm: function() {// 提交
  console.log(this.data.checkValue)//全部选中的项的value
  },
})

二、模拟实现单选框xml

思路:这个和多选差很少,区别就是须要在点击时清空其余项的选中状态,而后再把当前项设置为选中状态htm

代码也差很少

wxml的话就把check-group标签改成radio-group; js那边就在点击时多加个判断

?
1
2
3
4
5
6
7
8
9
10
11
<!--wxml-->
< view class = 'wrap' >
  < view class = 'checkbox-con' >
  < radio-group bindchange = "radioChange" >
   < label class = "{{item.checked?'checkbox checked':'checkbox'}}" wx:for = "{{checkboxArr}}" bindtap = 'radio' data-index = "{{index}}" wx:key = "item.name" >
   < checkbox value = "{{item.name}}" checked = "{{item.checked}}" />{{item.name}}
   </ label >
  </ radio-group >
   < button type = 'primary' bindtap = 'confirm' >提交</ button >
  </ view >
</ view >

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Page({
  data: {
  checkboxArr: [{
   name: '选项A' ,
   checked: false
  }, {
   name: '选项B' ,
   checked: false
  }, {
   name: '选项C' ,
   checked: false
  }, {
   name: '选项D' ,
   checked: false
  }, {
   name: '选项E' ,
   checked: false
  }, {
   name: '选项F' ,
   checked: false
  }],
  },
  radio: function (e) {
  var index = e.currentTarget.dataset.index; //获取当前点击的下标
  var checkboxArr = this .data.checkboxArr; //选项集合
  if (checkboxArr[index].checked) return ; //若是点击的当前已选中则返回
  checkboxArr.forEach(item => {
   item.checked = false
  })
  checkboxArr[index].checked = true ; //改变当前选中的checked值
  this .setData({
   checkboxArr: checkboxArr
  });
  },
  radioChange: function (e) {
  var checkValue = e.detail.value;
  this .setData({
   checkValue: checkValue
  });
  },
  confirm: function () { // 提交
  console.log( this .data.checkValue) //全部选中的项的value
  },
})

最后上个效果截图

相关文章
相关标签/搜索