微信小程序:自定义多选框样式,实现多选、全选功能,以及使用css实现选中打钩效果

<scroll-view class="page-container" scroll-y="true" enable-back-to-top="{{true}}">
    //多选组
    <checkbox-group bindchange="checkboxChange">
      <view class="box" wx:for="{{records}}" wx:key="id">
        //使用label包裹多选框和自定义样式
        <label class="box-checkbox {{item.checked? 'is-checked':''}}">
          //隐藏原生多选框
          <checkbox value="{{item.id}}" hidden="{{true}}" checked="{{item.checked}}"/>
          //自定义多选框
          <view class="box-checkbox_icon"></view>
        </label>
        <view class="box-item">
           //...记录项内容
        </view>
      </view>
    </checkbox-group>
    
  </scroll-view>
 <!-- 底部固定卡片 -->
  <view class="fixedCard">
    <view class="fixedCard-text">
      <view class="fixedCard-text_allcheck">
        <checkbox-group bindchange="handleAllCheck" >
          <label class="box-checkbox {{allcheck? 'is-checked':''}}">
            <checkbox value="{{allcheck}}" hidden="{{true}}" checked="{{allcheck}}" />
            <view class="box-checkbox_icon"></view>
          </label>
        </checkbox-group>
        <view>全选</view>
      </view>
      <view>
      共<text class="fixedCard-text_highlight">{{totalOrder}}</text>个订单,<text class="fixedCard-text_highlight">{{totalMoney}}</text>元
      </view>
    </view>
    <view class="fixedCard-button" bind:tap="handleNextStep">下一步</view>
  </view>
//选择订单项
checkboxChange(e){
  const records = this.data.records   //获得当前页面全部记录集合
  let _allcheck=false  //假设未全选
  const values = e.detail.value    //当前已选择项的id集合,因为checkbox的value="{{item.id}}"
  const lenI = records.length
  const lenJ = values.length
  if(lenI==lenJ){    //全选,选中项集合长度和当前页面记录长度一致
    console.log("选择全部")
    records.forEach(x=>{
      x.checked=true
    })
    _allcheck=true  //标记全选
  }else{    //非全选
    for (let i = 0; i < lenI; ++i) {
      records[i].checked = false
      for (let j = 0; j < lenJ; ++j) {
        if (records[i].id ==  values[j]) {
          records[i].checked = true
          break
        }
      }
    }
  }
  //计算选中项数值总计
  this.countTotal(records.filter(x=> x.checked==true))

  this.setData({   //更新数据重新渲染页面
    allcheck:_allcheck,  
    records:records
  })
},
// 全选按钮
handleAllCheck(e){
  const records = this.data.records
  if(records.length==0){
    wx.showToast({
      title: '无订单',
      icon: 'none',
      duration: 1500
    })
    return
  }
  if(!this.data.allcheck){  //全选
    records.forEach(x=>{
      x.checked=true
    })
    this.countTotal(records)
  }else{  //取消全选,即全不选
    records.forEach(x=>{
      x.checked=false
    })
    this.countTotal([])
  }
  this.setData({
    allcheck:!this.data.allcheck,
    records:records
  })
},

//计算
countTotal(val){
  let money=0,order=0
  if(val.length!=0){
    orderorder=val.length
    val.forEach(x=>{
      money+=x.totalDeductionFee
    })
    //小数点第三位之后四舍五入
    money=Math.round(money * 100) / 100
  }
  this.setData({
    totalOrder:order,
    totalMoney:money
  })
},

//下一步
handleNextStep(){
  const orderIds=[]
  this.data.records.map(function(item){
    if(item.checked==true){orderIds.push(item.id)}
  })
  // console.log("已选订单id集合",orderIds)
  if(orderIds.length > 0){
    wx.navigateTo({
      url:`/pages/submitApply?orderIds=${orderIds}`
    })
  }else{
    wx.showToast({
      title: '请选择订单',
      icon: 'none',
      duration: 1500
    })
  }
},

box-checkbox{
  display: block;
  width: 38rpx;
  height: 38rpx;
  margin-right: 25rpx;
  border-radius: 50%;
  border: 2rpx solid #dadbda;
  background-color: #fff;
  position: relative;
  &_icon::after{//小勾
    box-sizing: content-box;
    content: "";
    border: 4rpx solid rgb(0, 0, 0);
    border-radius: 10rpx;
    border-left: 0;
    border-top: 0;
    height: 20rpx;
    width: 10rpx;
    left: calc(50% - 7rpx);
    top: calc(50% - 14rpx);
    position: absolute;
    transform: rotate(45deg) scaleY(0);
    transition: transform .05s ease-in .05s;
    transform-origin: center;
  }

  &.is-checked {  //选中样式
    background-color: #ffd900;
    .box-checkbox_icon::after {
      transform: rotate(45deg) scaleY(1);
    }
  }
}

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
微信小程序中可以通过使用组件来实现单选、多选全选功能。 单选: 可以使用radio组件来实现单选功能。radio组件需要与radio-group组件配合使用。当用户点击其中一个radio后,radio-group会自动将其它的radio选项取消选中多选: 可以使用checkbox组件来实现多选功能。checkbox组件需要与checkbox-group组件配合使用。当用户点击某个checkbox时,checkbox-group会自动将其它的checkbox选项保持原有状态。 全选: 可以使用checkbox组件来实现全选功能。需要在checkbox组件中加入一个value属性,并将其绑定到全选按钮的checked属性上。当用户点击全选按钮时,将全选按钮的状态传递给所有的checkbox选项即可。 示例代码: 单选: ``` <radio-group> <label wx:for="{{list}}" wx:key="{{index}}"> <radio value="{{item.value}}">{{item.name}}</radio> </label> </radio-group> ``` 多选: ``` <checkbox-group> <label wx:for="{{list}}" wx:key="{{index}}"> <checkbox value="{{item.value}}">{{item.name}}</checkbox> </label> </checkbox-group> ``` 全选: ``` <checkbox value="all" checked="{{allChecked}}" bindchange="onAllChange">全选</checkbox> <checkbox-group> <label wx:for="{{list}}" wx:key="{{index}}"> <checkbox value="{{item.value}}" checked="{{item.checked}}">{{item.name}}</checkbox> </label> </checkbox-group> ``` 其中,allChecked和item.checked为数据中的属性,需要在js文件中定义和更新。onAllChange为全选按钮的change事件处理函数,代码如下: ``` onAllChange: function (e) { const isChecked = e.detail.value.length > 0; const list = this.data.list.map(item => { item.checked = isChecked; return item; }); this.setData({ allChecked: isChecked, list }); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋月华星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值