微信小程序 自定义复选框实现代码实例

功能: 

1、需要多选复选框,并且可以上拉滚动;

2、需要通过名称手写字母排序的,并且可以上拉滚动;

常规的小程序自带的原生picker无法满足我们的要求,因此一些特殊效果需要我们自定义来实现,废话不多说,我们直接看效果:

index.wxml布局

<view class="container">

<view class='class bgFFF' bindtap='isDep'>

<view class='class-text'>

<text class='red'> </text>

<text>开放部门</text>

</view>

<view class='class-choose'>

<text class='color333 perItem' wx:if="{{checkValue.length>0}}">

<block wx:for="{{checkValue}}" wx:key="index"> {{item}} </block>

</text>

<text wx:else>默认全部</text>

<image src='/images/right-icon.png' mode="widthFix"></image>

</view>

</view>

<view class='class bgFFF' bindtap='isPer'>

<view class='class-text'>

<text class='red'> </text>

<text>开放成员</text>

</view>

<view class='class-choose'>

<text class='color333 perItem' wx:if="{{depValue.length>0}}">

<block wx:for="{{depValue}}" wx:key="index"> {{item}} </block>

</text>

<text wx:else>默认全部</text>

<image src='/images/right-icon.png' mode="widthFix"></image>

</view>

</view>

</view>

<!-- 部门列表 -->

<view class='typeListBox' wx:if="{{isDep}}">

<view class='wrap'>

<view class='nav'>

<text class='active'>部门</text>

<!-- <text class='{{navId==2?"active":""}}' data-id='2' bindtap='getNav'>人员</text> -->

</view>

<view class='checkbox-con'>

<scroll-view scroll-y style="height: 700rpx;" scroll-top="{{scrollTop}}">

<checkbox-group bindchange="checkboxChange" class="checkbox-group">

<view wx:for="{{checkboxArr}}" wx:key="item.name">

<label class="{{item.checked?'checkbox checked':'checkbox'}}" bindtap='checkbox' data-index="{{index}}">

<checkbox value="{{item.name}}" checked="{{item.checked}}"/>{{item.name}}

</label>

</view>

</checkbox-group>

</scroll-view>

</view>

<view class='btn1'>

<button class='bgFFF' bindtap='cancel'>取消</button>

<button class='' bindtap='confirm'>确定</button>

</view>

</view>

</view>

<!-- 成员列表 -->

<view class='typeListBox' wx:if="{{isPer}}">

<view class='wrap'>

<!-- 字母锚点 -->

<view class='anchor'>

<view bindtap="jumpTo" wx:for="{{words}}" wx:key="i" data-opt="{{item}}">{{item}}</view>

</view>

<view class='nav'>

<text class='active'>人员</text>

</view>

<view class='checkbox-con'>

<scroll-view scroll-y style="height: 700rpx;" scroll-with-animation='true' scroll-top="{{scrollTop}}" scroll-into-view="{{toView}}">

<view class='typeList'>

<checkbox-group class="radio-group" bindchange="checkBoxPer">

<view wx:for="{{personnelArr}}" wx:key="index" wx:for-item="itemName" wx:for-index="itemNameInd">

<view class='typeList-item-title' id="{{itemName.name}}">{{itemName.name}}</view>

<label class='typeList-item' data-itemnameind='{{itemNameInd}}' bindtap="checkPer" wx:for="{{itemName.a}}" wx:key="a" wx:for-item="item" data-index="{{index}}">

<checkbox value="{{item.name}}" checked="{{item.checked}}" color='#3eace2'/>

<text>{{item.name}}</text>

</label>

</view>

</checkbox-group>

</view>

</scroll-view>

</view>

<view class='btn1'>

<button class='bgFFF' bindtap='cancel'>取消</button>

<button class='' bindtap='confirmPer'>确定</button>

</view>

</view>

</view>

index.wxss样式

.container {

display: flex;

flex-direction: column;

box-sizing: border-box;

background-color: #f5f5f5;

padding-top: 20rpx;

}

.class{

display: flex;

flex-direction: row;

padding: 20rpx 0;

background-color: #fff;

margin-bottom: 20rpx;

}

.class view.class-text{

flex: 1;

padding-left: 30rpx;

font-size: 14px;

}

.red{

margin-right: 10rpx;

color: #ff0000;

}

.class-choose{

max-width: 60%;

display: flex;

flex-direction: row;

text-align: right;

}

.class-choose-item{

display: flex;

flex-direction: column;

padding-right: 40rpx;

}

.class-choose text{

flex: 1;

font-size: 14px;

color: #999;

}

.class-choose text.color333{

color: #333;

}

.class-choose image{

width: 16px;

margin: 6rpx 20rpx 0;

}

/* 部门列表样式 */

.typeListBox{

z-index: 101;

position: fixed;

top: 0;

left: 0;

right: 0;

bottom: 0;

padding: 50rpx;

background: rgba(0,0,0,0.3);

}

.typeList{

/* margin-top: 200rpx; */

padding: 0 30rpx;

border-radius: 5px;

font-size: 13px;

background-color: #fff;

}

.typeList .radio-group{

display: flex;

flex-direction: column;

}

.typeList-item{

display: flex;

flex-direction: row;

padding: 20rpx 0;

border-bottom: 1rpx solid #f5f5f5;

}

.typeList-item text{

margin-left: 10rpx;

line-height: 48rpx;

}

.radio{

padding: 0 20rpx 0 0;

}

.engineer{

padding: 0 20rpx 0 0;

}

.engineer-text{

line-height: 46rpx;

}

.engineer-item{

padding: 10rpx 0;

}

.nav{

display: flex;

flex-direction: row;

border-bottom: 1rpx solid #f5f5f5;

}

.nav text{

padding: 20rpx;

flex: 1;

text-align: center;

font-size: 16px;

}

.nav text.active{

color: #3eace2;

border-bottom: 1rpx solid #3eace2;

}.wrap{

padding: 20rpx 30rpx;

border-radius: 5px;

font-size: 13px;

background-color: #fff;

position: relative;

}

.checkbox-con{

margin: 50rpx auto;

text-align: center;

position: relative;

}

.checkbox-group view{

float: left;

width: 50%;

display: flex;

flex-direction: column;

padding: 0 20rpx 40rpx;

box-sizing: border-box;

}

.checkbox{

flex: 1;

height: 72rpx;

line-height: 72rpx;

font-size: 28rpx;

color: #888888;

border: 1rpx solid #CECECE;

border-radius: 5rpx;

/* display: inline-block; */

/* margin: 0 10rpx 30rpx 0; */

position: relative;

}

/* .checkbox-group{

display: flex;

flex-direction: row;

} */

.checked{

color: #3eace2;

background: rgba(49,165,253,0.08);

border: 1rpx solid #3eace2;

}

.checkbox checkbox{

display: none

}

.checked-img{

width: 28rpx;

height: 28rpx;

position: absolute;

top: 0;

right: 0

}

.btn1{

display: flex;

flex-direction: row;

}

.btn1 button{

flex: 1;

background-color: #3eace2;

color: #fff;

}

.btn1 button.bgFFF{

margin-right: 20rpx;

color: #666;

background-color: #fff;

}

.perItem{

box-sizing: border-box;

text-overflow: ellipsis;

white-space: nowrap;

overflow: hidden;

}

.anchor{

z-index: 101;

position: absolute;

top: 150rpx;

right: 20rpx;

font-size: 12px;

}

.anchor view{

padding: 0 5rpx;

text-align: center;

}

.typeList-item-title{

padding: 10rpx 10rpx 5rpx;

color: #666;

background-color: #f5f5f5;

text-align: left;

}

index.js

const app = getApp()

Page({

data: {

checkboxArr: [

{

checked: false,//是否选中

id: "1",//部门能id

name: "部门1",

},

{

checked: false,//是否选中

id: "2",//部门能id

name: "部门2",

},

{

checked: false,//是否选中

id: "3",//部门能id

name: "部门3",

},

{

checked: false,//是否选中

id: "4",//部门能id

name: "部门4",

},

{

checked: false,//是否选中

id: "5",//部门能id

name: "部门5",

},

{

checked: false,//是否选中

id: "6",//部门能id

name: "部门6",

},

{

checked: false,//是否选中

id: "7",//部门能id

name: "部门7",

},

{

checked: false,//是否选中

id: "8",//部门能id

name: "部门8",

},

{

checked: false,//是否选中

id: "9",//部门能id

name: "部门9",

},

{

checked: false,//是否选中

id: "10",//部门能id

name: "部门10",

},

{

checked: false,//是否选中

id: "11",//部门能id

name: "部门11",

},

{

checked: false,//是否选中

id: "12",//部门能id

name: "部门12",

},

{

checked: false,//是否选中

id: "13",//部门能id

name: "部门13",

},

{

checked: false,//是否选中

id: "14",//部门能id

name: "部门14",

},

{

checked: false,//是否选中

id: "15",//部门能id

name: "部门15",

},

],//部门列表

personnelArr: null,//人员列表

checkValue: [],//部门

depValue: [],//部门

isDep: false,//部门显隐

isPer: false,//成员显隐

d_id: [],//部门id集合

u_id: [],//人员集合

words: null,//成员名称的手写字母

},

//控制部门的显隐

isDep: function () {

this.setData({

isDep: true,

})

},

//控制人员显隐

isPer: function () {

this.setData({

isPer: true,

})

},

//取消按钮

cancel: function () {

this.setData({

isDep: false,

isPer: false

})

},

//人员

checkPer: function (e) {

var index = e.currentTarget.dataset.index;//获取当前点击的下标

var ind = e.currentTarget.dataset.itemnameind;//获取当前点击的下标

var personnelArr = this.data.personnelArr;//选项集合

personnelArr[ind].a[index].checked = !personnelArr[ind].a[index].checked;//改变当前选中的checked值

// var u_id = this.data.u_id;//获取data中的成员id集合

// var id = personnelArr[ind].a[index].id;//获取选中的成员id

// //判断,当前选中的这个值的checked是不是已经选中,如果是则将id放入选中成员id集合,反之则移除

// if (personnelArr[ind].a[index].checked) {

// u_id.push(id);

// } else {

// this.removeByValue(u_id, id);

// }

this.setData({

personnelArr: personnelArr

});

},

checkBoxPer: function (e) {

var depValue = e.detail.value;

this.setData({

depValue: depValue

});

},

confirmPer: function () {// 提交

this.setData({

isPer: false,

})

},

//部门

checkbox: function (e) {

var index = e.currentTarget.dataset.index;//获取当前点击的下标

var checkboxArr = this.data.checkboxArr;//选项集合

checkboxArr[index].checked = !checkboxArr[index].checked;//改变当前选中的checked值

//如果需要部门联动成员

// var d_id = this.data.d_id;//获取data中的部门id集合

// var id = checkboxArr[index].id;//获取选中的部门id

// //判断,当前选中的这个值的checked是不是已经选中,如果是则将id放入选中部门id集合,反之则移除

// if (checkboxArr[index].checked) {

// d_id.push(id);

// } else {

// this.removeByValue(d_id, id);

// }

this.setData({

checkboxArr: checkboxArr

});

},

checkboxChange: function (e) {

var checkValue = e.detail.value;

this.setData({

checkValue: checkValue

});

},

confirm: function () {// 确定

this.setData({

isDep: false,

// depValue: []如果是联动,选中部门后需要清除选中的成员

})

// this.getUser();//通过选中部门来获取不通的部门成员,将获取到的数据存入checkboxArr中

},

onLoad: function () {

//模拟测试人员数据

var arr = {

data: [

{

checked: false,

id: "83",

name: "张三",

word: "Z",

}, {

checked: false,

id: "22",

name: "张三丰",

word: "Z",

}, {

checked: false,

id: "23",

name: "张无忌",

word: "Z",

}, {

checked: false,

id: "83",

name: "李四",

word: "L",

}, {

checked: false,

id: "83",

name: "王五",

word: "W",

}, {

checked: false,

id: "83",

name: "测试",

word: "C",

},

],//成员数组

words: ["C", "L", "W", "Z"],//成员字母集合

};

this.setData({

words: arr.words,

})

this.integration(arr)

},

// 整合人员字母

integration: function (list) {

// console.log(list)

var arr = [];

for (var j = 0; j < list.words.length; j++) {

var aa = {

name: null,

a: []

};

aa.name = list.words[j];

for (var k = 0; k < list.data.length; k++) {

if (list.words[j] == list.data[k].word) {

aa.a.push(list.data[k]);

}

}

arr.push(aa)

}

this.setData({

personnelArr: arr,

})

// console.log(arr)

},

})

以上是 微信小程序 自定义复选框实现代码实例 的全部内容, 来源链接: utcz.com/z/318382.html

回到顶部