Uniapp实现多选下拉框

Uniapp实现多选下拉框方法


前言

之前在使用Uniapp时,一直都是下拉框单选。今天某个项目需求需要使用Uniapp实现下拉框多选效果。由于Uniapp自身没有这个功能,因此只能在插件市场选择一个别人封装好的插件,我选择的是niceui-popup-select下拉选择器(支持多选)。可能是我下载的版本问题,实现效果不太满足我们的需求,因此对该插件源码进行修改调整。


一、效果展示

修改后支持动态配置下拉显示字段和选择完成后的显示列表效果

1.1 下拉效果图

在这里插入图片描述

1.2 下拉选择效果图

在这里插入图片描述

1.3 选择显示效果图

在这里插入图片描述

二、组件源码

将核心组件代码CustomCheckbox.vue、niceui-popup-select.vue放到components文件下,如果没有components,可以按照图结构进行目录场景
在这里插入图片描述

2.1.CustomCheckbox.vue源码

<template>
  <view class="custom-checkbox" :class="[{'is-checked': isChecked}]" @click="toggle" :style="[labelStyle]">
    <input type="checkbox" :checked="isChecked" @change="onChange" />
    <text class="checkmark" :style="[circleStyle]"></text>
	<text class="serve-info">{
  
  {label}}</text>
  </view>
</template>

<script>
export default {
     
     
  props: {
     
     
    value: Boolean,
    disabled: {
     
     
      type: Boolean,
      default: false
    },
	label:{
     
     
		type:[String,Number],
		default:''
	},
	fontSize:{
     
     
		type:String,
		default:''
	},
	color:{
     
     
		type:String,
		default:''
	},
	circleSize:{
     
     
		type:String,
		default:''
	},
	circleColor:{
     
     
		type: String,
		default:""
	}
  },
  computed: {
     
     
    isChecked: {
     
     
      get() {
     
     
        return this.value;
      },
      set(val) {
     
     
        this.$emit('input', val);
      }
    },
	labelStyle() {
     
     
		let styles = {
     
     }
		if (this.fontSize) {
     
     
			styles.fontSize = this.fontSize
		}
		if (this.color) {
     
     
			styles.color = this.color
		}
		return styles;
	},
	circleStyle(){
     
     
		let styles = {
     
     }
		if (this.circleSize) {
     
     
			styles.transform = this.circleSize
		}
		if (this.circleColor) {
     
     
			if(this.isChecked){
     
     
				styles.backgroundColor = this.circleColor
			}
		}
		return styles;
	}
  },
  methods: {
     
     
    toggle() {
     
     
		
      if (!this.disabled) {
     
     
        this.isChecked = !this.isChecked;
		this.$emit('toggle', !this.isChecked);
      }
    },
    onChange(event) {
     
     
	
      this.$emit('change', event.target.checked);
    }
  }
};
</script>

<style scoped lang="scss">
.custom-checkbox {
     
     
  display: flex;
  align-items: center;
  position: relative;
  padding-left: 1rpx;
  margin-bottom: 0rpx;
  cursor: pointer;
  font-size: 32rpx;
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
  margin: 35rpx 0;
}

.custom-checkbox input {
     
     
  position: absolute;
  opacity: 0;
  cursor: pointer;
  height: 0;
  width: 0;
}

.checkmark {
     
     
  position: absolute;
  top:1rpx;
  margin-bottom:0rpx;
  right: 0;
  height: 40rpx;
  width: 40rpx;
  /* background-color: #eee; */
  border:solid 1rpx #ddd;
  border-radius: 50%
### UniApp实现下拉框的方法或组件 在UniApp开发中,实现下拉框可以通过种方式完成。以下是两种常见的方法:自定义级联下拉框[^1]和使用强力推荐的高效模糊搜索下拉框组件[^2]。 #### 方法一:自定义级联下拉框 通过纯CSS和JavaScript实现一个简单的级联下拉框。这种方式的优点在于可以根据具体业务需求进行高度定制,缺点是需要手动编写大量代码。以下是一个基本示例: ```html <template> <view class="dropdown"> <button @click="toggleDropdown">择</button> <view v-if="isDropdownOpen" class="dropdown-content"> <label v-for="(item, index) in options" :key="index"> <input type="checkbox" v-model="selectedItems" :value="item.value" /> {{ item.label }} </label> </view> </view> </template> <script> export default { data() { return { isDropdownOpen: false, options: [ { label: '项1', value: 'option1' }, { label: '项2', value: 'option2' }, { label: '项3', value: 'option3' } ], selectedItems: [] }; }, methods: { toggleDropdown() { this.isDropdownOpen = !this.isDropdownOpen; } } }; </script> <style> .dropdown { position: relative; display: inline-block; } .dropdown-content { position: absolute; background-color: #fff; border: 1px solid #ccc; padding: 10px; z-index: 1; } </style> ``` 这种方法适合对UI有特定需求的场景,并且可以直接嵌入到项目中[^1]。 #### 方法二:使用高效模糊搜索下拉框组件 如果希望减少开发成本并快速集成功能强大的下拉框,可以考虑使用现成的第三方组件。例如,某些开源库提供了支持、模糊搜索等功能的下拉框组件[^2]。这些组件通常具有以下特点: - **支持**:允许用户同时项。 - **模糊搜索**:提供输入框以快速过滤项列表。 - **灵活配置**:可以通过简单的配置调整样式和行为。 虽然没有直接提及具体的库名称,但可以通过NPM或GitHub搜索类似功能的组件,如`uni-data-select`或其他社区贡献的插件[^2]。 ### 注意事项 在实现方式时,需根据项目需求权衡开发时间和功能复杂度。如果业务逻辑较为简单,推荐使用自定义方法;若追求高效开发与丰富功能,则优先考虑成熟的第三方组件。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值