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


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

1、模拟实现多选框:

实现思路:思路非常简单,给每个选项绑定checked属性,类型为布尔值,点击取反即可

?
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的样式只提供更改颜色,这对实际项目中的需求显然是不够的,所以自己模拟实现一个。

踩坑点:小程序不支持操作dom

1、模拟实现多选框:

实现思路:思路非常简单,给每个选项绑定checked属性,类型为布尔值,点击取反即可

?
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: 

?
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
  },
})

2、模拟实现单选框

思路:这个和多选差不多,区别就是需要在点击时清空其他项的选中状态,然后再把当前项设置为选中状态

代码也差不多

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
  },
})

最后上个效果截图


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM