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后的预览截图
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

无需信用卡注册美区Apple ID指南

第一步 准备工作 1、一个没有注册过AppleID的邮箱&#xff0c;建议最好是Gmail邮箱 2、一个苹果手机&#xff0c;当然这个是必须的 3、需要科学上网 第二步 苹果网站注册 为了避免cookie的干扰&#xff0c;最好是在无痕模式下打开以上网页&#xff0c;创建你的AppleID&#…

rabbitmq-java基础详解

一、rabbitmq是什么&#xff1f; 1、MQ定义 MQ&#xff08;Message Queue&#xff09;消息队列 主要解决&#xff1a;异步处理、应用解耦、流量削峰等问题&#xff0c;是分布式系统的重要组件&#xff0c;从而实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性的架…

Spring+SpringMVC+Mybatis进行项目的整合

Spring SpringMVCM Mybatis 整合 一、 通过idea创建maven工程 二、 引入依赖项以及导入mybatis逆向工程的插件 将如下的文件替换所在工程的pom文件 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4…

HCIA的访问控制列表ACL

ACL -----access control-list 允许/拒绝 ACL作用&#xff1a; 1.实现访问控制 2.定义感兴趣流量 ACL分类&#xff1a; 标准ACL 2000-2999&#xff08;只关注源IP地址&#xff0c;使用时应该尽量靠近目标&#xff09; 扩展ACL 3000-3999&#xff1a;写ACL不能写在源上&…

反射计数 - 华为OD统一考试

OD统一考试 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 给定一个包含 0 和 1 的二维矩阵, 给定一个初始位置和速度。 一个物体从给定的初始位置触发, 在给定的速度下进行移动, 遇到矩阵的边缘则发生镜面反射无论物体经过 0 还是 1&#xff0c;都不…

2024美赛数学建模思路 - 案例:异常检测

文章目录 赛题思路一、简介 -- 关于异常检测异常检测监督学习 二、异常检测算法2. 箱线图分析3. 基于距离/密度4. 基于划分思想 建模资料 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 一、简介 – 关于异常…

宠物空气净化器真的有用吗?五款猫用宠物空气净化器测评!

作为一个养猫四年的铲屎官&#xff0c;我不得不说&#xff0c;宠物空气净化器是21世纪养猫人最伟大的神器之一&#xff01; 当我刚开始养猫的时候&#xff0c;我并没有意识到猫毛会成为一个如此头疼的问题。虽然朋友们告诉我要做好心理准备&#xff0c;但我并没有想到家里的猫毛…

Apache Zeppelin学习记录2

Apache Zeppelin学习记录2 文章目录 Apache Zeppelin学习记录2前言一、基础调用二、带参数调用1.代码块要增加一行z.textbox("folder_path", "input")2.读取result 总结 前言 上一章讲了如何使用zeppelin来接入python&#xff0c;本节我们来看看如何使用R…

ArcGIS初始化软件界面Normal.mxt

ArcGIS有时候永久了&#xff0c;或者呢突然不自觉软件界面乱了&#xff0c;或者一些窗口打开却找不到&#xff01; 这时候可以去删除arcgis的界面配置文件&#xff0c;Normal.mxt 删除后再打开软件&#xff0c;软件界面就会回到初始化设置了&#xff01; 文件所在的路径&…

3d音响按键怎么建立模型---模大狮模型网

要建立3D音响按键的模型&#xff0c;您可以按照以下步骤进行&#xff1a; 选择建模软件&#xff1a;首先&#xff0c;选择一个三维建模软件&#xff0c;如Blender、3ds Max或Maya。这些软件都提供了丰富的建模工具和功能&#xff0c;适合用于创建复杂的三维模型。 参考图像&am…

IPv6自动隧道---ISATAP隧道

ISATAP隧道 ISATAP(Intra-Site Automatic Tunnel Addressing Protocol)是另外一种自动隧道技术。ISATAP隧道同样使用了内嵌IPv4地址的特殊IPv6地址形式,只是和6to4不同的是,6to4是使用IPv4地址做为网络前缀,而ISATAP用IPv4地址做为接口标识。 站点内自动隧道寻址协议(I…

Web Animation API

工作中经常会遇到需要动画的场景&#xff0c;连贯动画都是用CSS实现&#xff0c;&#xff0c;但是如果遇到需要用户互动介入的动画&#xff0c;那纯CSS很比较吃力&#xff0c;也不是不能实现&#xff0c;需要动态修改CSS变量&#xff0c;而且动画容易被JS代码阻塞&#xff0c;导…

VMP比较正确的编译教程

一、编译环境 1.1 编译整体配置 采用VS2022社区版MSVC2017_xpQT5.6.0WDK7.1&#xff08;编译DDK需要&#xff0c;不需要DDK的可以不用下载&#xff09; 1.1 VS2022安装 1.1.1 除常规勾选桌面C以外&#xff0c;需要勾选win xp支持和支持相应的MSVC版本。教程采用msvc2017和x…

​批量文件夹随机小写字母重命名:文件夹重命名简单步骤,高效结果

在日常工作中&#xff0c;经常要对大量的文件夹重命名进行管理和查找文件。手动重命名每个文件夹不仅耗时&#xff0c;而且容易出错。现在一起来看云炫文件管理器如何给文件夹名称批量随机小写字母重命名&#xff0c;简单的步骤&#xff0c;高效率的结果。 文件夹名称随机小写…

多文件转二维码的两种方式,有兴趣的了解一下

多个文件能一键生成二维码吗&#xff1f;二维码是现在很多人用来展示文件内容的一种手段&#xff0c;在制作二维码图片之后&#xff0c;其他人扫码就可以查看文件或者下载文件&#xff0c;有效的提升文件获取的效率。一般情况下&#xff0c;文件二维码分为多个文件生成一个二维…

黑群晖利用云服务器公网IP

一、服务器端 1.使用工具 xShell&#xff1a;连接云服务器使用。 云服务&#xff1a;阿里云&#xff0c;系统采用的是Ubuntu20.02&#xff0c;预装了宝塔界面&#xff0c;设置好root密码。 2.操作 远程登录阿里云&#xff0c;安装Vim、Wget等功能&#xff1b;下载和一键安装…

LeetCode面试题02.07链表相交

力扣题目链接 思想&#xff08;数学&#xff09;&#xff1a;设链表A的长度为a&#xff0c;链表B的长度为b&#xff0c;A到交点D的距离为c&#xff0c;B到交点D的距离为d。显然可以得到两者相交链表的长度为&#xff1a;a - c b - d ,变换一下式子得到&#xff1a;a d b …

Android平台Unity下如何通过WebCamTexture采集摄像头数据并推送至RTMP服务器或轻量级RTSP服务

技术背景 我们在对接Unity下推送模块的时候&#xff0c;遇到这样的技术诉求&#xff0c;开发者希望在Android的Unity场景下&#xff0c;获取到前后摄像头的数据&#xff0c;并投递到RTMP服务器&#xff0c;实现低延迟的数据采集处理。 在此之前&#xff0c;我们已经有了非常成…

密码产品推介 | 沃通安全电子签章系统(ES-1)

产品介绍 沃通安全电子签章系统&#xff08;ES-1&#xff09;是一款基于密码技术、完全自主研发的商用密码产品&#xff0c;严格遵循国家密码管理局制定的相关标准&#xff0c;可为企业和个人提供安全、合规的电子签章功能服务。产品的主要用途是为各类文书、合同、表单等电子…

Solana Mobile开启第二代Saga手机预售,怎么购买Solana Mobile?

PANews 1月17日消息&#xff0c;Solana Mobile官方宣布开启其第二代Saga手机&#xff08;Chapter 2&#xff09;的预售&#xff0c;预购押金为450美元&#xff0c;预计将于2025年上半年发货。同时&#xff0c;Chapter 2的发售将会包括推荐&#xff08;Referrals&#xff09;和积…