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


    原文地址: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: 550rpx;
     margin: 50rpx auto
    }
      
    .checkbox-con{
     margin-top: 40rpx;
     text-align: center
    }
    .checkbox{
     width: 260rpx;
     height: 72rpx;
     line-height: 72rpx;
     font-size: 28rpx;
     color: #888888;
     border: 1rpx solid #CECECE;
     border-radius: 5rpx;
     display: inline-block;
     margin: 0 10rpx 20rpx 0;
     position: relative
    }
    .checked{
     color: #1A92EC;
     background: rgba(49,165,253,0.08);
     border: 1rpx solid #31A5FD;
    }
    .checkbox checkbox{
     display: none
    }
    .checked-img{
     width: 28rpx;
     height: 28rpx;
     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
     },
    })

    最后上个效果截图

  • 相关阅读:
    Express中间件简介
    Express中间件概念
    浏览器cookie插件
    node=day7
    cookie可视化操作工具---EditThisCookie
    node之cookie和session对比
    node通过session保存登录状态
    浅谈表单同步提交和异步提交
    node.js服务端存储用户密码md5加密
    jQuery的ajax里dataType预期服务器返回数据类型
  • 原文地址:https://www.cnblogs.com/zdd-java/p/11654238.html
Copyright © 2020-2023  润新知