在工作中频繁用到复选框,于是自己写了个组件,增加其复用性,提高效率。
先看效果图:

提交后得到一个选中项的id组成的数组

下边直接上代码:

代码地址为:components/checkGrop/checkGrop

wxml:

<form bindsubmit="formSubmit">
  <view class='content'>
  <!-- 一级菜单 -->
    <scroll-view class='scrollLeft' scroll-y>
      <block wx:for="{{list}}" wx:key="item">
        <view class="leftBox" catchtap='ontap' data-index='{{index}}' style='{{n==index?"border-left:8rpx solid #1aad16;color:#1aad16":""}}'>
          {{item.istitle}}
          <view class='num' hidden="{{checked[index].length>0?false:true}}">
            <text>{{allNum[index]?allNum[index]:(checked[index].length>0?checked[index].length:0)}}</text>
          </view>
        </view>
      </block>
    </scroll-view>
    <!-- 二级菜单 -->
    <scroll-view class='scrollRight' scroll-y>
      <view class="weui-cells weui-cells_after-title">
      <!-- 二级菜单中的全部选项 -->
        <label class="weui-cell weui-check__label" catchtap='all'>
          <checkbox class="weui-check" value="{{childlist[n][0].value}}" checked="{{childlist[n][0].checked}}" />
          <view class="weui-cell__hd weui-check__hd_in-checkbox">
            <icon class="weui-icon-checkbox_circle" type="circle" size="23" wx:if="{{!childlist[n][0].checked}}"></icon>
            <icon class="weui-icon-checkbox_success" type="success" size="23" wx:if="{{childlist[n][0].checked}}"></icon>
          </view>
          <view class="weui-cell__bd">{{childlist[n][0].istitle}}</view>
        </label>
        <checkbox-group bindchange="checkboxChange">
        <!-- 二级菜单中的剩余选项 -->
          <block wx:for="{{childlist[n]}}" wx:key="value">
            <label class="weui-cell weui-check__label" wx:if='{{item.istitle!="全部"}}'>
              <checkbox class="weui-check" value="{{item.id}}" checked="{{item.checked}}" />
 
              <view class="weui-cell__hd weui-check__hd_in-checkbox">
                <icon class="weui-icon-checkbox_circle" type="circle" size="23" wx:if="{{!item.checked}}"></icon>
                <icon class="weui-icon-checkbox_success" type="success" size="23" wx:if="{{item.checked}}"></icon>
              </view>
              <view class="weui-cell__bd">{{item.istitle}}</view>
            </label>
          </block>
        </checkbox-group>
      </view>
    </scroll-view>
  </view>
  <view class="btn-area">
    <button catchtap='back'>返回</button>
    <button formType="submit">提交</button>
  </view>
</form>

wxss:

page{
  background: #f8f8f8;
}
.content{
  position: absolute;
  top:0;
  bottom:100rpx; 
  width: 100%;
}
.scrollLeft{
  box-sizing: border-box;
  float: left;
  width: 25%;
  height: 100%;
  border-right: 1rpx solid #ddd;
  font-size: 35rpx;
}
.scrollRight{
  float: left;
  width: 75%;
  height: 100%;
}
.leftBox{
  position: relative;
  box-sizing: border-box;
  width: 100%;
  height: 100rpx;
  display: flex;
  justify-content: center;
  align-items:center;
  border-bottom: 1rpx solid #ddd;
}
.num{
  position: absolute;
  top:10rpx;
  right: 10rpx;
  width: 30rpx;
  height: 30rpx;
  display: flex;
  justify-content: center;
  align-items: center;
  background-color: #f10215;
  border-radius: 50%;
  color: white;
  font-size: 22rpx;
}
.rightBox{
  box-sizing: border-box;
  width: 100%;
}
.weui-cells {
  position: relative;
  margin-top: 1.17647059em;
  background-color: #FFFFFF;
  line-height: 1.41176471;
  font-size: 17px;
}
.weui-cells_after-title {
  margin-top: 0;
}
.weui-cell {
  padding: 10px 15px;
  position: relative;
  display: -webkit-box;
  display: -webkit-flex;
  display: flex;
  -webkit-box-align: center;
  -webkit-align-items: center;
          align-items: center;
}
.weui-check__label:active {
  background-color: #ECECEC;
}
.weui-check {
  position: absolute;
  left: -9999px;
}
.weui-check__hd_in-checkbox {
  padding-right: 0.35em;
}
.weui-icon-checkbox_circle,
.weui-icon-checkbox_success {
  margin-left: 4.6px;
  margin-right: 4.6px;
}
.weui-cell__bd {
  -webkit-box-flex: 1;
  -webkit-flex: 1;
          flex: 1;
}
.btn-area{
  position: absolute;
  bottom: 0;
  width: 100%;
  height: 100rpx;
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-top: 20rpx;
}
.btn-area>button:first-child{
  width: 30%;
  height: 80%;
  color: white;
  background-color: orange;
  display: flex;
  justify-content: center;
  align-items: center;
}
.btn-area>button:last-child{
  width: 65%;
  height: 80%;
  color: white;
  background-color: #1aad16;
  display: flex;
  justify-content: center;
  align-items: center;
}

json:

{
  "component":true
}

js:

Component({
  properties: {
    list: {
      type: Array,
      value: [],
    },
    select:{
      type: Array,
      value: [],
    }
  },
  data: {
    childlist: [], 
    n: 0,
    checked: [],
    allNum: [],
  },
  ready(){
    var that=this;
    var list = that.data.list;//传递过来的数据
    // console.log(list)
    var select = that.data.select;
    var checked = new Array;
    var allNum = []; 
      var aaa = [];
      // 检查默认选中状态
      for (let i = 0; i < list.length; i  ) {
        for (let k = 0; k < list[i].childlist.length; k  ) {
          for (let j = 0; j < select.length; j  ) {
            if (list[i].childlist[k].id == select[j]) {
              aaa = [];
              // 若某条二级数组中存在多个选中的项要做判断筛选
              if (checked[i]) {
                // check中第i项如果存过值,那么将在此项中继续加入值
                checked[i].forEach(function (item) {
                  aaa.push(item);
                })
                aaa.push(list[i].childlist[k]);
                checked[i] = aaa;
              } else {
                // check中第i项没有存过值,那么将值存入第i项
                if (list[i].childlist[k].istitle == "全部") {
                  for (let s = 0; s < list[i].childlist.length; s  ) {
                    list[i].childlist[s].checked = true
                    allNum[i] = list[i].childlist.length - 1;
                    checked[i] = [list[i]];
                  }
                } else {
                  checked[i] = [list[i].childlist[k]];
                }
 
              }
              list[i].childlist[k].checked = true;
            }
          }
        }
      }
    
    that.setData({
      'childlist[0]': list[0].childlist,
      list: list,
      checked: checked,
      allNum: allNum,
    })
    console.log(checked);
    console.log(allNum);
  },
  methods: {
    ontap(e) {
      var that = this;
      var n = e.currentTarget.dataset.index;
      var childlist = "childlist["   n   "]";
      that.setData({
        [childlist]: that.data.list[n].childlist,
        n: n
      })
    },
    all() {
      var that = this;
      var n = that.data.n;
      var childlist = "childlist["   n   "]";
      var checked = "checked["   n   "]";
      var allNum = "allNum["   n   "]";
      var all = "";
      var checkArr = [];
      var checkboxItems = that.data.childlist[n];
      if (checkboxItems[0].checked) {
        checkboxItems[0].checked = true;
        checkArr = [];
      } else {
        checkboxItems[0].checked = false;
        // checkArr.push(checkboxItems[0])
        checkArr.push(that.data.list[n])
        all = checkboxItems.length - 1;
      }
      checkboxItems[0].checked = !checkboxItems[0].checked
      for (let k = 1; k < checkboxItems.length; k  ) {
        checkboxItems[k].checked = checkboxItems[0].checked;
      }
      console.log(checkboxItems);
 
      that.setData({
        [childlist]: checkboxItems,
        [checked]: checkArr,
        [allNum]: all ? all : 0,
      }, function () {
        console.log(that.data.checked);
      })
    },
    checkboxChange(e) {
      var that = this;
      var n = that.data.n;
      console.log('checkbox发生change事件,携带value值为:', e.detail.value)
      var checkboxItems = that.data.childlist[n];
      var values = e.detail.value;
      var flag = "";
      var childlist = "childlist["   n   "]";
      var checked = "checked["   n   "]";
      var allNum = "allNum["   n   "]";
      var checkedArr = [];
      var all = "";
 
      for (var i = 0, lenI = checkboxItems.length; i < lenI;   i) {
        checkboxItems[i].checked = false;
        for (var j = 0, lenJ = values.length; j < lenJ;   j) {
          if (checkboxItems[i].id == values[j]) {
            checkboxItems[i].checked = true;
            checkedArr.push(checkboxItems[i]);
            break;
          }
        }
      }
      if (values.length == checkboxItems.length - 1) {
        checkboxItems[0].checked = true;
        // checkedArr = [checkboxItems[0]];
        checkedArr = [that.data.list[n]];
        all = checkboxItems.length - 1;
      }
      this.setData({
        [childlist]: checkboxItems,
        [checked]: checkedArr,
        [allNum]: all
      });
      // console.log(checkedArr)
    },
    formSubmit: function (e) {
      var that = this;
      console.log('form发生了submit事件');
      var values = that.data.checked;
      var arr = [];
      var arr1 = [];
      for (let i = 0; i < values.length; i  ) {
        if (values[i] != undefined) {
          arr.push(values[i]);
        }
      }
 
      for (let i = 0; i < arr.length; i  ) {
        for (let j = 0; j < arr[i].length; j  ) {
          arr1.push(arr[i][j])
        }
      }
      console.log(arr1);//选中的值
      var detail = arr1;
 
      this.triggerEvent("formSubmit", detail);
    },
    back() {
      this.triggerEvent("back");
    }
  }
})

使用方法:

在需要使用的页面的json中声名启用组件

如:

{
  "usingComponents": {
    "check": "/components/checkGrop/checkGrop"
  }
}

然后在需要使用的页面的wxml中使用自己起的组件名就好了

如:

<check list="{{hangye}}" select="{{checkedid}}" bind:formSubmit="formSubmit" bindback="back"></check>

其中list 是你要往组件里传递的数组。 select为默认选中的的数据的id,组件里边的参数可以根据自己的需求更换!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持Devmax。

微信小程序复选框组件使用详解的更多相关文章

  1. 微信小程序之html5 canvas绘图并保存到系统相册

    这篇文章主要介绍了微信小程序之html5 canvas绘图并保存到系统相册,需要的朋友可以参考下

  2. HTML5单选框、复选框、下拉菜单、文本域的实现代码

    这篇文章主要介绍了HTML5单选框、复选框、下拉菜单、文本域的实现代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. ios – ipatool因异常而失败

    我正在导出企业部署的存档,我从ipatool获得了一个例外.我该如何解决这个问题?

  4. xcode4 – 重新启用XCode 4“Xcode启动时显示此屏幕”复选框.

    我设法取消选中Xcode4’显示这个屏幕,当Xcode启动’复选框,我想要它再次.这是如何实现的?除了“启动新项目”之外,Xcode4文档中还没有提到用户prefs中的任何内容.此外,Google上的任何地方似乎都没有任何问题.如果有人知道重新启用复选框的位置,请告诉我.再次感谢.V.V.解决方法选择窗口>欢迎使用主菜单中的Xcode,然后重新检查“显示此窗口…”

  5. 应用商店 – 自定义B2B应用的复选框未在iTunes连接中显示

    我想将一个应用程序作为自定义b2b应用程序带给AppleStore.唯一的问题是我的iTunes连接没有选项.这个B2B计划在德国不可用吗?我找不到任何具体的信息.也许你们中的一个有同样的问题.解决方法我有同样的问题,复选框不在那里.确保在iTunesConnect内您已经同意在“合同,税务和银行”下的相关合同.一旦你要求并同意这些,复选框应该出现.

  6. Swift - 让StoryBoard设计视图,程序运行时都使用横屏形式

    1,运行时横屏将项目属性“General”->“DeviceOritentation”的Portrait复选框去掉2,storyboard设计视图横屏在storyboard中,单击中间界面视图的头部,在右侧属性面板中。把Size设置为iPhone4-inch把Orientation设置成Landscape

  7. 如何在swift(iOS)中创建单选按钮和复选框?

    我正在开发一个允许进行调查的应用程序。我的布局是从基于XML的问题生成的。我需要创建单选按钮(单选)和复选框。我没有发现任何有用的swift。有没有人有想法?对于无线电按钮和复选框,没有内置的东西。您可以轻松实施复选框。您可以为UIControlStatenormal的按钮设置一个uncheckedImage,并为您的UIControlStateSelected设置一个checkedImage。现在点击按钮将更改其图像,并在选中和未检查的图像之间交替显示。要使用单选按钮,您必须为您要作为单选按钮的所有按钮

  8. swift – 在Xcode 6.0.1中的Interface Builder中,“限制边缘”是什么意思

    我理解“间距到最近邻”的目的,但是“限制边缘”是什么意思?在特定控件按钮的边缘“间距到最近邻”之间有一个链接,同时检查名为“限制边缘”的复选框吗?Autolayout中此功能的作用是什么?

  9. android – 带复选框的ListView项目 – 如何删除复选框涟漪效应?

    我有一个带有项目的ListView包含一个复选框和一些其他元素.问题是,当我点击Android5设备上的列表项时,我看起来像这样:我不希望在复选框周围产生涟漪效应.我怎么能实现这一点?

  10. Android复选框可见性问题

    我在我的代码中使用了一个复选框,当它检查时它会使textview和editText可见,但如果我取消选中de复选框,它们将继续显示而不是消失.这是代码:并且在相对布局内部的xml的一部分:当我取消选中复选框时,我该怎么做才能使textView和EditText消失?解决方法使用View.VISIBLE,View.INVISIBLE,View.GONE来控制可见性.

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部