微信小程序-自定义复选框

功能: 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)
  },
})

原文地址:https://www.cnblogs.com/D-deng/p/11447939.html

时间: 2024-10-02 03:12:24

微信小程序-自定义复选框的相关文章

微信小程序radio点选框,再次点击取消

radio点击当前选项,取消选择,在网上尝试找了很多方法都不生效,通过给radio绑定一个点击事件( bindtap)来实现这一功能,直接看代码: index.wxml: <view class="page"> <view class="page__hd"> <text class="page__title">radio</text> <text class="page__desc&

微信小程序-自定义弹出框

<---------------------------------定义组建-------------------------------------------------------------------------> // components/component-tag-name.js Component({ options: { multipleSlots: true // 在组件定义时的选项中启用多slot支持 }, /** * 组件的属性列表 */ properties: {

微信小程序自定义弹窗wcPop插件|仿微信弹窗样式

微信小程序自定义组件弹窗wcPop|小程序消息提示框|toast自定义模板弹窗 平时在开发小程序的时候,弹窗应用场景还是蛮广泛的,但是微信官方提供的弹窗比较有局限性,不能自定义修改.这个时候首先想到的是自定义组件化开发,就是把弹出框封装成一个组件,然后多处调用. 解决了小程序开发自定义弹窗出现后,遮罩层下的页面仍可以滚动的方法: 给遮罩层的最外层view中加入catchtouchmove="preventTouchMove" 即可解决该遮罩层点透问题. 根据需要还可以自定义多个按钮及事

自定义复选框样式及全选操作

自定义复选框样式 复选框结构 input框去其样式宽高为0;定位到父盒子内,我们需用其:checked 属性 下面的span为自定义样式,定位到父盒子内 . 效果展示 js 代码 模拟复选框样式 $(".ck_MN").click(function(){ var ck_Inp = $(this).siblings(".ckIpt"); var Ck_box = $(this).parents(".Ckbox"); if(ck_Inp.prop(&

微信小程序-自定义底部导航

代码地址如下:http://www.demodashi.com/demo/14258.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html 1.基本需求. 实现用户自定义底部导航 2.案例目录结构 二.程序实现具体步骤 1.自定义nav.wxml代码 <template name="nav"> <view class=&quo

值得记录的(五)- 微信小程序自定义 tabbar

一定的需求情况下,无法使用小程序原生的 tabbar 的时候,需要自行实现一个和 tabbar 功能一模一样的自制组件. 查阅了海量的博客和文档之后,亲自踩坑.总结了三种在不使用微信小程序原生 tabbar的情况下自制 tabbar 的方法.并说说这几种方法各自的特色. 类 navigator 跳转方式 类 navigator 跳转方式是我自己起的名称,因为它的实现思路就是这个样子的.期初参考 微信小程序自定义tabBar组件开发 这篇博文的思路.进行了这种方式的尝试,并为后续提供了解决思路.在

小程序自定义多选按钮 给后台传值方法

小程序自定义多选按钮 1.html部分 <checkbox-group bindchange="checkboxChange" class = "flex"> <label class="checkbox {{item.checked?'active':''}}" wx:for="{{items}}" bindtap="addclass" data-index="{{index}

微信小程序自定义导航栏(wx_custom_navigation_bar) 自定义返回键、首页键,动态设置标题,响应式组件

微信小程序自定义导航栏 navigation bar 返回键 首页 github: https://github.com/chen-yt/wx_custom_navigation_bar https://github.com/Superman2113/wx_custom_navigation_bar 代码 navbar组件 navbar.wxml <view class="navbar" style="{{'height: ' + navigationBarHeight

微信小程序实现多选分享

微信小程序拉取好友列表后,默认只能选一个分享,现在在分享回调onShareAppMessage里加上这段代码,拉取好友列表时,右上角会出现多选按钮,这样就解决了微信小程序安卓下只能单选分享的问题. /** * 用户点击右上角分享 */ onShareAppMessage: function (res) { if ((res && res[0] && res[0].from == 'menu') || (res.from && res.from == 'men