【小程序】多选和单选组件的封装

真正开发过小程序的开发者会发现,小程序里面的单选框和多选框封封装的实在不够友好,一般与UI都会有比较大的出入,所以下面来探讨一下单选框和多选框的封装。

效果

比如我们要做一个这种样式的单选框和多选框组件,我们改怎么去处理呢?

代码

wxml

<!-- 判断某个元素是不是指定数组内 -->
<wxs module="checkbox">
  var checkStatus = function (arr, item) {
    return arr.indexOf(item) >= 0
  };

  module.exports.checkStatus = checkStatus;
</wxs>

<view hidden='{{isHidden}}'>
  <!-- 单选组件 -->
  <radio-group
    class="radio-group"
    bindchange="radioChange"
    wx:if="{{selectType == 'radio'}}">
    <label
      class='{{radioIndex == item.index ? focusRadioClass : initRadioClass}}'
      wx:for="{{radioData}}"
      wx:key="{{index}}"
      id="{{item.index}}">
      <view class='item-index'>
        <radio
          style='opacity: 0'
          value="{{item.index}}"
          checked="{{item.checked}}"/>
        <view class='index'>{{item.index}}</view>
      </view>
      <view class='flex-item text-center'>{{item.value}}</view>
    </label>
  </radio-group>
  <!-- 多选组件 -->
  <checkbox-group
    class="checkbox-group"
    bindchange="checkboxChange"
    wx:if="{{selectType == 'checkbox'}}">
    <label
      class='{{checkbox.checkStatus(checkboxIndexArr, item.index) ? focusCheckboxClass : initCheckboxClass}}'
      wx:for="{{checkboxData}}"
      wx:key="{{index}}"
      id="{{item.index}}">
      <view class='item-index'>
        <checkbox
          style='opacity: 0'
          value="{{item.index}}"
          checked="{{item.checked}}"
          disabled="{{checkboxIndexArr.length > maxLength - 1 && !checkbox.checkStatus(checkboxIndexArr, item.index)}}"/>
        <view class='index'>{{item.index}}</view>
      </view>
      <view class='flex-item text-center'>
        {{item.value}}
      </view>
    </label>
    <view>{{checkboxIndexArr.prototype}}</view>
  </checkbox-group>
</view>

wxss

.flex-wrapper {
  display: flex;
}
.flex-item {
  flex: 1;
}
.text-center {
  text-align: center;
}

.radio-group, .checkbox-group {
  margin: 0 auto;
  width: 490rpx;
}
.radio-group label, .checkbox-group label {
  margin-bottom: 50rpx;
  height: 68rpx;
  line-height: 68rpx;
  border: 1rpx solid #000;
  border-radius: 10rpx;
  font-size: 30rpx;
  color: #000;
}
.radio-group label.active, .checkbox-group label.active {
  background-color: #fcc919;
}
.radio-group label .item-index, .checkbox-group label .item-index {
  position: relative;
  flex: 0 0 40rpx;
  margin: 0 0 0 20rpx;
  width: 40rpx;
  height: 68rpx;
}
.radio-group label .item-index .index, .checkbox-group label .item-index .index {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  margin: auto;
  width: 40rpx;
  height: 40rpx;
  overflow: hidden;
  line-height: 40rpx;
  text-align: center;
  border-radius: 50%;
  background-color: #fff;
}

javascript

Component({
  // 组件的属性列表
  properties: {
    selectType: {
      type: String,
      value: 'checkbox'
    },
    radioData: {
      type: Array,
      value: []
    },
    checkboxData: {
      type: Array,
      value: []
    },
    isHidden: {
      type: Boolean,
      value: false
    },
    maxLength: {
      type: Number,
      value: 2
    }
  },
  // 组件的初始数据
  data: {
    initRadioClass: 'radio flex-wrapper flex-direction-row',
    focusRadioClass: 'radio flex-wrapper flex-direction-row active',
    initCheckboxClass: 'checkbox flex-wrapper flex-direction-row',
    focusCheckboxClass: 'checkbox flex-wrapper flex-direction-row active',
    radioIndex: null,
    checkboxIndexArr: []
  },
  // 组件的方法列表
  methods: {
    // radio选择改变触发的函数
    radioChange: function (e) {
      let value = e.detail.value;
      this.setData({
        radioIndex: value
      })

      this.triggerEvent('radioChange', value);
    },
    // checkbox选择改变触发的函数
    checkboxChange: function (e) {
      let value = e.detail.value;
      this.setData({
        checkboxIndexArr: value
      })

      this.triggerEvent('checkboxChange', value);
    }
  }
})

分析

其中,单选框比较简单,重点在于多选框。其中比较坑的地方就是需要手动来控制 checkboxIndexArr 的内容。

  1. 小程序多选框在选中后会返回一个所选中的value的数组 checkboxIndexArr ,所以我们自定义的样式需要通过判断当前框的 value 是不是在 checkboxIndexArr 中(切记,checkboxIndexArr中的每个值的类型都是String),小程序在wxml中绑定方法时没办法携带参数的,所以需要需要将这个函数写在 wxs 中。
  2. 如果需要有默认选中,需要单独把默认选中的框的样式激活,同时手动将默认选中的框的checked设置为 true ,并将其 value 放入 checkboxIndexArr 中。
  3. 如果需要做全选和全不选,需要在放置一个变量 checked ,Boolean属性,通过控制 checked 开控制是否全选,但是,还是需要手动来添加和清空 checkboxIndexArr 的内容。
  4. 如果需要做反选功能,需要在数据中单独设置一个控制是否选中的checked属性,通过改变数据checked的值来改变多选框的选中效果,与上面一样,还是要手动来添加和清空 checkboxIndexArr 的内容。

个人博客:午后南杂

原文地址:https://www.cnblogs.com/luanhewei/p/9483921.html

时间: 2024-10-17 22:58:04

【小程序】多选和单选组件的封装的相关文章

Vant Weapp小程序蹲坑之使用checkbox组件

引子 checkbox-group及checkbox组件是开发小程序中频繁使用的组件,当然在vant weapp组件库中对应的分别是van-checkbox-group和van-checkbox.遗憾的是,官方提供的仅是组件在原生微信小程序框架下的用法,但我们所关注的是如何把这些组件改写到mpvue框架中.有关此二组件常用属性,在文后引用地址(官方)都有详细介绍,在此省略. 问题1:数据绑定与模板字符串问题 这个问题困绕了我很长时间,搜索网络,包括google英文搜索,几乎没有找到相应的答案.首

CK2020微信小程序入门与实战 常用组件API开发技巧项目实战

新年伊始,学习要趁早,点滴记录,学习就是进步! 随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到程序开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了.对于学习有困难不知道如何提升自己可以加扣:1225462853  获取资料. 下载地址:https://pan.baidu.com/s/1hsU5EIS 微信小程序入门与实战 常用组件API开发技巧项目实战 小程序官方正式公告,开放了更多的入口,个人开发者可以申请

小程序-文章:微信小程序常见的UI框架/组件库总结

ylbtech-小程序-文章:微信小程序常见的UI框架/组件库总结 1.返回顶部 1. 想要开发出一套高质量的小程序,运用框架,组件库是省时省力省心必不可少一部分,随着小程序日渐火爆,各种不同类型的小程序也渐渐更新,其中不乏一些优秀好用的框架/组件库. 1:WeUI  小程序–使用教程 https://weui.io/ 官方介绍:WeUI 是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信内网页和微信小程序量身设计,令用户的使用感知更加统一.小程序开发中最常用到的一款框架,受广大

Vant Weapp小程序蹲坑之使用toast组件

问题 使用Mpvue框架结合Vant Weapp组件库进行微信小程序开发中使用toast组件时,不小心又陷入"坑"中,当然主要还是路径问题. 注意点 使用toast组件时,与其它最普通的Vant Weapp组件相比,有几点需要注意.为了更方便理解,还是先上源码(index.vue),如下: <template> <div> <van-panel title="基础用法"> <van-picker :columns="

Vant Weapp小程序蹲坑之使用submit-bar组件

本文介绍在Vant Weapp小程序开发中使用submit-bar组件时需要注意的部分问题.坑来坑去,先上示例代码吧,由简单到复杂顺序. main.js代码 main.json代码 index.vue代码 <template> <view> <van-panel title="基础用法"> <van-submit-bar :price="3050" button-text="提交订单" @submit=&

微信小程序学习笔记-2-常用组件介绍

微信小程序常用组件 组件的定义: 开发者可以利用微信团队提供的框架中的一系列基础组件进行快速的开发,什么是组件? 组件是视图层的基本组成单元. 组件自带一些功能与微信风格的样式. 一个组件通常包括开始标签和结束标签,属性用来修饰这个组件,内容在两个标签之间. 形式: <tagname property="value"> Content goes here </tagname> 例如: <view class="container">

微信小程序入门与实战/常用组件/API/开发技巧/项目实战 共11章

实战开发电影资讯微信小程序 学习之前需要掌握JavaScript和CSS基础 ----------------课程目录---------------- 第1章:什么是微信小程序 开篇及课程特色介绍 直观感受一下微信小程序 小程序适合做什么样的应用 对开发者的影响 学习基础 小作业 第2章:环境搭建与开发工具 开篇介绍及下载工具 小程序目前情况及限制 小程序开发工具介绍 第3章:开始小程序之旅 本章内容简介 官方种子项目介绍与小程序的文件结构 新建我们自己的项目:ReaderMovie 开始制作项

小程序--swiper轮播图组件

效果图展示: 先了解下swiper组件参数配置 轮播实现的具体步骤如下: 第一步:添加图片素材,我这边是放到images下,文件以及图片名字自定义即可. 第二步:在wxml中进行页面布局 在这里呢,用到了列表渲染.swiper组件,三元运算符(注:由于小程序不能操作dom,三元运算符还有一个常用的使用场景是控件class样式输出,达到jQuery.addClass()的效果) <view class="swiper-container"> <swiper autopl

微信小程序入门与实战 常用组件API开发技巧项目实战

第1章 什么是微信小程序?介绍小程序的特点与适用场景.对开发者的影响以及课程特色!七月老师小程序进阶课<纯正商业应用--微信小程序实战>与<微信小程序商城构建全栈应用>已上线,全面进阶小程序! 第2章 小程序环境搭建与开发工具介绍小程序开发工具的下载与安装.微信Web开发者工具主要功能简介 第3章 从一个简单的"欢迎"页面开始小程序之旅完成第一个小程序页面,并学习小程序的基本目录与文件结构,View.Image.Text组件,RPX自适应单位,Flex弹性盒子模