原文地址:https://www.jb51.net/article/150127.htm
1、模拟实现多选框:
实现思路:思路非常简单,给每个选项绑定checked属性,类型为布尔值,点击取反即可
1
2
3
4
5
6
7
8
9
10
11
|
< 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
|
< 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
|
.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:
checked: false
}, {
name:
checked: false
}, {
name:
checked: false
}, {
name:
checked: false
}, {
name:
checked: false
}, {
name:
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
|
< 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 ;
this .setData({
checkboxArr: checkboxArr
});
},
radioChange: function (e) {
var checkValue = e.detail.value;
this .setData({
checkValue: checkValue
});
},
confirm: function () {
console.log( this .data.checkValue)
},
})
|
最后上个效果截图