Uniapp多选Popup(弹出层)

uniapp中多选组件很少,故个人简单开发了一个,可简单使用,也可根据个人需求稍微改进

支持的功能

  • 单选
  • 多选(默认)
  • 限制选择数量
  • 默认选中
  • 禁用选项

属性说明

属性默认值说明
singlefalsetrue为开启单选,否则为多选
max-可选最多项
maxMessage-超出最多项的提示信息,没有的话则默认清掉最旧的数据,添加当前选择数据
list-数据集合
defaults-默认选中项主键值的集合
keyName-主键名,为空的话则视为list集合为字符串数组,直接将项当作值
disabledKey-禁用属性名,前提是一定要有keyName属性
disabledValue-禁用值,前提是有disabledKey属性

简单使用

<template><view><button @click="onMultiplePick">选择</button><multiple-pick ref="multiplePick" :list="multiplePickList" key-name="id" disabled-key="disabled"disabled-value="1" :defaults="[]" @confirm="onMultiplePickConfirm" :max="2" max-message="已超出最大选项"></multiple-pick></view>
</template><script>export default {data() {return {multiplePickList: []}},methods: {onMultiplePick() {this.$refs.multiplePick.show();},onMultiplePickConfirm(selectedList) {console.log(selectedList);this.$refs.containerMultiplePick.close();}}}
</script>

代码

下面是多选弹窗组件代码,使用了uView的u-popup来作为弹出容器,可根据项目框架自行更改弹出组件。

<template><u-popup :show="pickShow" mode="bottom" :round="10" closeOnClickOverlay @close="onCancel"><view class="multiple-pick-content"><view class="top"><view class="cancel" @tap="onCancel">取消</view><view class="confirm" @tap="onConfirm">确认</view></view><view class="list-container"><view class="item-container"><view class="item" :class="{'selected': isSelected(item), 'disabled': isDisabled(item)}"v-for="(item, index) in list" :key="index" @tap="onClick(item, index)"><view>{{ keyName ? item[keyName] : item }}</view><u-icon v-if="isSelected(item)" name="checkmark" :color="isDisabled(item) ? '#959595' : '#2979ff'"size="18"></u-icon></view></view></view></view></u-popup>
</template><script>
export default {name: "multiplePick",data() {return {pickShow: false,selecteds: []};},props: {/*** 开启单选*/single: Boolean,/*** 可选最多项*/max: Number,/*** 超出最大项提示*/maxMessage: String,/*** 数据集合*/list: Array,/*** 默认选择*/defaults: Array,/*** 主键名,如果没有,则识别为字符串数组*/keyName: String,/*** 禁用属性名,前提是有keyName*/disabledKey: String,/*** 禁用值,前提是有disabledKey*/disabledValue: String},watch: {defaults: {handler(n) {// 不能直接赋值,否则selecteds变化时会改变默认值this.selecteds = n.slice(0, n.length);},immediate: true}},methods: {/*** 当前项是否禁用*/isDisabled(item) {return this.keyName && this.disabledKey && this.disabledValue && item[this.disabledKey] === this.disabledValue;},/*** 当前项是否选中*/isSelected(item) {return this.selecteds.includes(this.keyName ? item[this.keyName] : item);},/*** 打开选择器*/show() {this.pickShow = true;},/*** 关闭选择器*/close() {this.pickShow = false;},/*** 数据项点击监听*/onClick(item, index) {if (this.isDisabled(item)) {// 如果是禁用的,不执行return;}// 获取当前项值const value = this.keyName ? item[this.keyName] : item;if (this.single) {// 开启单选this.selecteds = [];this.selecteds.push(value);} else {// 获取当前项在已选中的集合中的位置const i = this.selecteds.indexOf(value);// 存在则删除,不存在则添加if (i !== -1) {this.selecteds.splice(i, 1);} else {if (this.max && this.selecteds.length >= this.max) {// 如果有最大值且已选超过最大值if (this.maxMessage) {// 有提示提示内容uni.showToast({icon: 'none',title: this.maxMessage});return;}// 否则删掉最旧的数据this.selecteds.shift();}this.selecteds.push(value);}}},/*** 确认按钮事件*/onConfirm() {this.$emit('confirm', this.selecteds);},/*** 取消按钮事件*/onCancel() {// 重新赋值选中的集合this.selecteds = this.defaults.slice(0, this.defaults.length);this.pickShow = false;this.$emit('cancel');}}
}
</script><style lang="scss" scoped>
.multiple-pick-content {padding: 20px;box-sizing: border-box;min-height: 200px;max-height: 50vh;.top {padding: 0 0 10px 0;width: 100%;display: flex;justify-content: space-between;line-height: 32px;.cancel {color: #f43d18;}.confirm {color: #0066ff;}}.list-container {padding: 10px 0px 40px 0px;box-sizing: border-box;max-height: calc(50vh - 42px);height: 100%;overflow-y: auto;}.item-container {width: 100%;.item {padding: 10px 0;box-sizing: border-box;width: 100%;display: flex;justify-content: space-between;&.selected {color: #2979ff !important;}&.disabled {color: #959595 !important;}}}
}
</style>

预览

以下为打包app后的预览截图
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/631639.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FFMPEG命令生成各国国旗

文章目录 亚洲篇中国~待完善朝鲜~待补充韩国~待补充蒙古~待补充日本越南~待补充老挝 欧洲篇挪威~待补充瑞典~待补充芬兰~待补充冰岛~待补充丹麦~待补充爱沙尼亚拉脱维亚立陶宛白俄罗斯~待补充乌克兰摩尔多瓦~待补充俄罗斯德国 亚洲篇 中国~待完善 先画个五角星 在100x100的画…

Tokenization 指南:字节对编码,WordPiece等方法Python代码详解

在2022年11月OpenAI的ChatGPT发布之后&#xff0c;大型语言模型(llm)变得非常受欢迎。从那时起&#xff0c;这些语言模型的使用得到了爆炸式的发展&#xff0c;这在一定程度上得益于HuggingFace的Transformer库和PyTorch等库。 计算机要处理语言&#xff0c;首先需要将文本转…

在自定义数据集上训练 YOLOv8 进行目标检测

这是目标检测中令人惊叹的 AI 模型之一。在这种情况下&#xff0c;您无需克隆存储库、设置要求并配置模型&#xff0c;就像在 YOLOv5 及其之前的版本中所做的那样。 在 YOLOv8 中&#xff0c;不需要执行这些手动任务。您只需安装 Ultralytics 即可&#xff0c;我将向您展示如何…

uniapp开发小程序—scroll-view实现内容滚动时, 标题也滚动

一、需求 scroll-view实现内容滚动时&#xff0c; 标题也滚动 二、效果 三、代码实现 <template><view class"content"><view class"head">头部固定区域</view><view class"list_box"><!-- 菜单左边 -->&l…

React16源码: React中的beginWork的源码实现

beginWork 1 &#xff09;概述 在 renderRoot 之后&#xff0c;要对我们的 Fiber 树每一个节点进行对应的更新更新节点的一个入口方法&#xff0c;就是 beginWork这个入口方法会有帮助我们去优化整棵树的更新过程 react 它的节点其实是非常多的&#xff0c;如果每一次子节点的…

学习 SSR(Server-Side Rendering)的心得和体会

学习SSR&#xff08;Server-Side Rendering&#xff09;的心得和体会 引言 在现代的前端开发中&#xff0c;性能优化和用户体验始终是核心考量之一。而在众多优化策略中&#xff0c;服务器端渲染&#xff08;Server-Side Rendering&#xff0c;简称SSR&#xff09;是一个重要…

netty 使用证书

1创建私钥&#xff08;.key&#xff09; openssl genrsa -out server.key 2048 2基于私钥&#xff08;.key&#xff09;创建证书签名请求&#xff08;.csr&#xff09; openssl req -new -key server.key -out server.csr -config ./…/ssl.cnf 3.生成CA私钥&#xff08;ca…

【c++】栈(satck)和队列(queue)

目录 一、stack 1.stack的介绍 2.stack的使用 3.stack的模拟实现 二、queue 1.queue的介绍 2.queue的使用 3.queue的模拟实现 三、priority_queue 1.priority_queue的介绍 2.priority_queue的使用 一、stack 1.stack的介绍 &#xff08;1&#xff09;stack是一种容…

kotlin 和 java 的区别

一、什么是kotlin&#xff1f; Kotlin&#xff08;科特林&#xff09;是一个用于现代多平台应用的静态编程语言&#xff0c;由 JetBrains 开发。Kotlin可以编译成Java字节码&#xff0c;也可以编译成JavaScript&#xff0c;方便在没有JVM的设备上运行。除此之外Kotlin还可以编…

pytest -- 基本使用详解

1. pytest基本介绍 pytest 是一个功能强大且易于使用的 Python 测试框架&#xff0c;用于编写单元测试、集成测试和功能测试。 它提供了丰富的功能和灵活的用法&#xff0c;使得编写和运行测试变得简单而高效。 --------------->>>>> pytest框架优点&#xff1a…

Git中config配置

文章目录 简介一、config级别二、config基本配置 简介 Git是一个开源的分布式版本控制系统&#xff0c;用于处理各种规模的项目版本管理。它由Linus Torvalds设计&#xff0c;主要用于Linux内核开发。Git的特点包括速度、简单的设计、对非线性开发模式的支持、完全的分布式能力…

springboot(ssm仓库管理系统 wms智能仓储管理系统Java系统

springboot(ssm仓库管理系统 wms智能仓储管理系统Java系统 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xff09; …

企业怎么传输大容量视频?

在企业中&#xff0c;视频的应用越来越广泛&#xff0c;不论是在内部沟通、培训、宣传&#xff0c;还是在外部合作、推广、展示方面&#xff0c;视频都扮演着不可或缺的角色。然而&#xff0c;由于视频文件通常较大&#xff0c;传输时往往会面临网速慢、容量限制、安全风险等问…

flutter 五点一:MaterialApp Theme

ThemeData factory ThemeData({bool? applyElevationOverlayColor, //material2的darkTheme下 增加一个半透明遮罩 来凸显阴影效果 material3下无效 貌似没啥用NoDefaultCupertinoThemeData? cupertinoOverrideTheme, //ios组件样式 Iterable<ThemeExtension<dyn…

【Java基础_01】Java运行机制及运行过程

【Java基础_01】Java运行机制及运行过程 文章目录 【Java基础_01】Java运行机制及运行过程1.Java 运行机制及运行过程1.1 Java 核心机制-Java 虚拟机 [JVM java virtual machine] 1.2 JDK&#xff0c;JRE1.3 JVM,JDK和JRE1.4 环境变量path1.4.1 为什么要配置path1.4.2 配置环…

C++中的三元运算符(也称为条件运算符)是一种简洁的语法,用于基于一个布尔条件表达式选择两个值中的一个。

文章目录 用法举例&#xff1a;另一个例子&#xff1a;注意事项&#xff1a; C中的三元运算符&#xff08;也称为条件运算符&#xff09;是一种简洁的语法&#xff0c;用于基于一个布尔条件表达式选择两个值中的一个。三元运算符的一般形式是&#xff1a; condition ? expr1 :…

集中常见的排序方法Go语言版本实现

简单排序&#xff1a;插入排序、选择排序、 冒泡排序 分治排序&#xff1a;快速排序、归并排序 分配排序&#xff1a;桶排序、基数排序 树状排序&#xff1a;堆排序 其他&#xff1a;计数排序、希尔排序 稳定排序&#xff1a;如果 a 原本在 b 的前面&#xff0c;且 a b&#x…

Mesh自组网通信技术概述

Mesh自组网核心技术 Mesh自组网&#xff08;Mesh Networking&#xff09;是一种网络技术&#xff0c;主要用于在多个节点之间建立动态的、自我管理的网络连接。这种技术的核心在于其自我组织和自我修复的能力&#xff0c;使得网络能够在节点移动或节点故障时自动调整。以下是Me…

2024.1.17 用户画像day02 - Elastic Search

目录 ES和数据库的类比 ELK集中日志协议栈介绍 ES的介绍 ES的架构 ES中的名词 ES中的角色 分片与副本的区别在于: MYSQL分库与分表: 倒排序索引: ES写入数据原理: ES读取、检索数据原理: 重点: ES 的架构 , ES读写的原理 ES和数据库的类比 关系型数据库非关系型数…

mysql进阶-索引进阶

目录 1. 索引的相关语法 1.1 创建索引&#xff1a; 1.2 删除索引&#xff1a; 1.3 其他修改或创建方法&#xff1a; 2. 索引创建分类 2.1 索引类型 2.2 索引方法 2.3 索引分类 3. 索引原则 3.1 覆盖索引 3.2 最左前缀原则 3.3 索引下推(index condition pushdown) …