微信小程序实现类似picker多选

版本迭代picker单选改为多选,官方文档只有多列选择器没有多选,自己写呗
最终实现效果图
在这里插入图片描述
实现思路:
1.自己画模态框
2.遍历初始数据push新增参数checked:false
3.点击改变checked值来实现多选

上代码:
whtml:modalName变量控制模态框显隐

 <view class="picker flex" bindtap='radioChange'>
          <view class="cen">等级 <view class="countnum" wx:if="{{checkNum>0}}">{{checkNum}}</view>
          </view>
          <image class="img" mode="widthFix" src="/images/icon-arrow-select.png"></image>
</view>


<view class="modal-box {{modalName?'cur':''}}">
      <view class='modal-dialog'>
        <view class="checkbox_box">
          <view class="check_top">
            <view class="check_tit">等级选择(可多选)</view>
            <view class="check_list">
              <view class="check_item {{item.checked?'checked':''}}" wx:for="{{grade}}" wx:key="index" bindtap="multiple"
                data-value="{{item.value}}">{{item.key}}
                <image class="checkimg" wx:if="{{item.checked}}" src="/images/check.png"></image>
              </view>
            </view>
          </view>
          <view class="check_btn">
            <view class="qk" bindtap='closeModal'>清空</view>
            <view class="confirm" bindtap="checkConfirm">确定 <view class="countnum2" wx:if="{{checkNum>0}}">({{checkNum}})</view></view>
          </view>
        </view>
      </view>
</view>

js

   data:{
	hospitalLevel: [],//医院等级
	grade :[
	  {
	    key: '三级甲等',
	    value: '301',
	    checked: false
	  },
	  {
	    key: '三级乙等',
	    value: '302',
	    checked: false
	  },
	  {
	    key: '三级丙等',
	    value: '303',
	    checked: false
	  },
	  {
	    key: '二级甲等',
	    value: '201',
	    checked: false
	  },
	  {
	    key: '二级乙等',
	    value: '202',
	    checked: false
	  },
	  {
	    key: '二级丙等',
	    value: '203',
	    checked: false
	  },
	  {
	    key: '一级甲等',
	    value: '101',
	    checked: false
	  },
	  {
	    key: '一级乙等',
	    value: '102',
	    checked: false
	  },
	  {
	    key: '一级丙等',
	    value: '103',
	    checked: false
	  },
	],
    modalName: false,//模态框显隐
    checkNum: 0,//选中数量
   }
  /*显示弹窗*/
  radioChange: function () {
    var that = this;
    that.setData({
      modalName: !that.data.modalName,
    })
  },
  //关闭弹窗
  closeModal: function (e) {
    var that = this;
    var nowgrade = that.data.grade
    nowgrade.map(item => {
      item.checked = false
    })
    that.setData({
      grade: nowgrade,
      checkNum: 0,
    })
  },
  //点击选择
  multiple: function (e) {
    var that = this;
    var value = e.currentTarget.dataset.value
    var nowgrade = that.data.grade
    var checkNum = []
    nowgrade.map(item => {
      if (item.value == value) {
        item.checked = !item.checked
      }
      if (item.checked == true) {
        checkNum.push('ok')
      }
    })
    that.setData({
      grade: nowgrade,
      checkNum: checkNum.length
    })
  },
  //点击确定走接口
  checkConfirm: function () {
    var that = this;
    var nowgrade = that.data.grade
    var paramsData = []
    nowgrade.map(item => {
      if (item.checked == true) {
        paramsData.push(item.value)
      }
    })
    that.setData({
      hospitalLevel: paramsData,
      pageNum: 1,
      modalName: false,
    })
    this.fetch()//请求
  },
  

wxss:

/* --------多选-start------- */
/* 模态框显示时 禁止后面div滚动 */ 
.isfixed{ 
  position: fixed;
  top:0;
  left:0;

}
.modal-box {
  position: fixed;
  top: 173rpx;
  right: 0;
  bottom: 0;
  left: 0;
  z-index: 1110;
  opacity: 0;
  outline: 0;
  text-align: center;
  -ms-transform: scale(1.185);
  transform: scale(1.185);
  backface-visibility: hidden;
  perspective: 1000px;
  background: rgba(0, 0, 0, .6);
  transition: all .6s ease-in-out 0;
  pointer-events: none
}

.modal-box.cur {
  opacity: 1;
  transition-duration: .3s;
  -ms-transform: scale(1);
  transform: scale(1);
  overflow-x: hidden;
  overflow-y: auto;
  pointer-events: auto
}

.modal-dialog {
  position: relative;
  top: 0;
  left: 0;
  /* display: inline-block;
  vertical-align: middle; */
  margin-left: auto;
  margin-right: auto;
  width: 100%;
  background: #fff;
}

.checkbox_box {
  background: #fff;
  border-top: 1rpx solid #DDE1E7
}

.check_top {
  padding: 36rpx;
  padding-right: 0
}

.check_tit {
  margin-bottom: 5rpx;
}

.check_tit {
  font-size: 24rpx;
  font-family: 'PingFang SC';
  font-weight: 400;
  color: #999999;
  text-align: left;
}

.check_list {
  display: flex;
  justify-content: flex-start;
  flex-wrap: wrap;
}

.check_item {
  width: 200rpx;
  height: 64rpx;
  margin-right: 36rpx;
  margin-top: 20rpx;
  background: #F4F5F9;
  border-radius: 6rpx;
  text-align: center;
  line-height: 64rpx;
  position: relative;
}

.checkimg {
  position: absolute;
  top: 10rpx;
  right: 10rpx;
  width: 24rpx;
  height: 24rpx;

}

.check_btn {
  width: 100%;
  display: flex;
  justify-content: space-around;
  align-items: center;
  border-top: 1px solid #DCE1E8;
  /* display: none; */
}

.checked {
  background: #DBE9FC;
  color: #1E79EC;
}

.qk {
  width: 50%;
  height: 92rpx;
  background: #FFFFFF;
  text-align: center;
  line-height: 92rpx;
  font-size: 32rpx;
  font-family: 'PingFang SC';
  font-weight: 500;
  color: #666666;

}

.confirm {
  width: 50%;
  height: 92rpx;
  display: flex;
  justify-content: center;
  align-items: center;
  background: #1E79EC;
  text-align: center;
  line-height: 92rpx;
  font-size: 32rpx;
  font-family: 'PingFang SC';
  font-weight: 500;
  color: #FFFFFF;

}

.cen {
  display: flex;
  align-items: center;
}

.countnum {
  width: 26rpx;
  height: 26rpx;
  font-size: 20rpx;
  border: 2rpx solid #1E79EC;
  border-radius: 50%;
  text-align: center;
  line-height: 26rpx;
  color: #1E79EC;
  margin-left: 8rpx;
}

.countnum2 {
  margin-left: 6rpx;
  font-size: 32rpx;
  font-family: 'PingFang SC';
  font-weight: 500;
  color: #FFFFFF;

}

/* -----------------end------------------ */
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值