uniapp实现的数据选择器,支持H5、微信小程序

采用uniapp-vue3实现的数据选择器,支持H5、微信小程序(其他小程序未测试过,可自行尝试)

  • 支持本地自定义过滤、远程接口过滤,
  • 为了避免弹窗面板超出边界的情况,自动计算弹窗面板安置的位置(在微信小程序,节点信息是页面渲染后才拿得到,所以会有一段位移过程,大神如果更合适的方案,可以自行优化)
  • 支持自定义弹窗面板显示内容
  • 支持自定义取值字段(默认为options: [{label:‘键’, value: ‘值’, …}]格式)

由于移动端输入场景下会弹出键盘,如果设置为失焦时关闭弹窗面板, 则收起键盘时,弹窗就会被关闭,无法再进行下一步选择。所以采用弹窗常驻,手动点击右边图标关闭弹窗的方式

可到插件市场下载尝试: https://ext.dcloud.net.cn/plugin?id=17287

  • 使用示例

H5示例
在这里插入图片描述
微信小程序示例
在这里插入图片描述

props属性

id

组件唯一标识

同个页面存在多个wo-select组件的情况,id为必填项,因为需要通过id去计算弹窗面板与输入框的位置,以便安置弹窗面板在合适的位置,避免超出边界

id: {
    type: String,
    default: 'inputId',
    reqiured: true
},

value

默认值(valueField字段指定的字段值)

value: {
    type: String || Number,
    default: null
},

options

结构化数据

options: {
    type: Array,
    default: () => []
},

placeholder

占位描述

placeholder: {
    type: String,
    default: '请选择数据'
},

labelField

选中后输入框显示的值的取值字段

labelField: {
    type: String,
    default: 'label'
},
如果 options = [{ name: '按钮1', id: 1}, { name: '按钮2', id: 2 }]; labelField = 'name'
则选中后,输入框中则显示name字段的值

valueField

选中值的取值字段

valueField: {
    type: String,
    default: 'value'
}
如果 options = [{ name: '按钮1', id: 1}, { name: '按钮2', id: 2 }]; valueField = 'id'
则选中值就是id字段的值

事件

@filter

过滤事件,支持本地过滤、远程过滤等

@on-change

选中后返回值,值为valueField配置的字段值

示例

<template>
	<view class="content">
		<view class="card">
			<view class="title">默认样式</view>
			<view>
				<wo-select
					class="white-select"
					:id="'inputOne'"
					:options="state.data"
					:label-field="'label'"
					:value-field="'value'"
					@filter="onFilter"
					@on-change="onChangeStaff1"
				></wo-select>
			</view>
			<view class="title">选中值为:{{ state.res1 }}</view>
		</view>
		<view class="card">
			<view class="title">设置初始值</view>
			<view>
				<wo-select
					class="white-select"
					:id="'inputTwo2'"
					:value="'2'"
					:options="state.data"
					:label-field="'label'"
					:value-field="'value'"
					@filter="onFilter"
					@on-change="onChangeStaff2"
				></wo-select>
			</view>
			<view class="title">选中值为:{{ state.res2 }}</view>
		</view>
		<view class="card">
			<view class="title">自定义面板</view>
			<view>
				<wo-select
					class="white-select"
					ref="selectorRef1"
					:id="'inputTwo1'"
					:options="state.data"
					:label-field="'label'"
					:value-field="'value'"
					@filter="onFilter"
					@on-change="onChangeStaff3"
				>
					<view style="display: flex; flex-direction: column; gap: 20rpx">
						<view style="display: flex; justify-content:center">这是头部</view>
						<view
							v-for="item in state.data"
							:key="item.value"
							style="font-size: 24rpx; z-index: 120; display: flex; justify-content: space-between;"
							@click="selectorRef1.onClickSelect(item)"
						>
							<view style="width: 200px;">{{ item.label }}</view>
							<view style="background-color: dodgerblue; color: white; padding: 4px 8px;border-radius: 8rpx;">{{ item.category }}</view>
						</view>
					</view>
				</wo-select>
			</view>
			<view class="title">选中值为:{{ state.res3 }}</view>
		</view>
		<view class="card dark">
			<view class="title" style="color: white">暗黑样式</view>
			<view>
				<wo-select
					class="dark-select"
					ref="selectorRef"
					:id="'inputTwo'"
					:options="state.data"
					:label-field="'label'"
					:value-field="'value'"
					@filter="onFilter"
					@on-change="onChangeStaff4"
				>
					<view style="display: flex; flex-direction: column; gap: 20rpx">
						<view
							v-for="item in state.data"
							:key="item.value"
							style="font-size: 24rpx; z-index: 120; display: flex; justify-content: space-between;"
							@click="selectorRef.onClickSelect(item)"
						>
							<view style="width: 200px;">{{ item.label }}</view>
							<view style="background-color: dodgerblue; color: white; padding: 4px 8px;border-radius: 8rpx;">{{ item.category }}</view>
						</view>
					</view>
				</wo-select>
			</view>
			<view class="title" style="color: white;">选中值为:{{ state.res4 }}</view>
		</view>
		<view class="flex-center">内容区</view>
		<view class="card">
			<view class="title">面板位置自动调整</view>
			<view>
				<wo-select
					class="white-select"
					:id="'inputThree'"
					:placeholder="'输入过滤'"
					:options="state.data"
					:label-field="'label'"
					:value-field="'value'"
					@filter="onFilter"
					@on-change="onChangeStaff5"
				>
				</wo-select>
			</view>
			<view class="title">选中值为:{{ state.res5 }}</view>
		</view>
		<view class="flex-center">内容区</view>
	</view>
</template>

<script setup lang="ts">
	import { reactive, ref } from 'vue'
	const selectorRef1 = ref()
	const selectorRef = ref();
	const state = reactive({
		data: [
			{
				label: '哈墨的脑袋',
				value: '1',
				category: '正常'
			},
			{
				label: '摩西女神的手臂',
				value: '2',
				category: '异常'
			},
			{
				label: '奥尔墨的铠甲',
				value: '3',
				category: '维修中'
			},
			{
				label: '摩西女神的翅膀',
				value: '4',
				category: '正常'
			},
			{
				label: '战神瑞尔的斧头',
				value: '5',
				category: '正常'
			},
			{
				label: '丘比特的箭头',
				value: '6',
				category: '异常'
			},
			{
				label: '雅典娜的光明盾',
				value: '7',
				category: '异常'
			}
		] as any[],
		userOptions: [] as any[],
		res1: '',
		res2: '',
		res3: '',
		res4: '',
		res5: '',
	})
	// 克隆一份数据,用于过滤筛选
	state.userOptions = JSON.parse(JSON.stringify(state.data))
	const onFilter = (e: any) => {
	  state.data = state.userOptions.filter((res) => {
	    return res.label.indexOf(e.detail.value) !== -1
	  });
	};
	const onChangeStaff1 = (e: any) => {
		state.res1 = e
	};
	const onChangeStaff2 = (e: any) => {
		state.res2 = e
	};
	const onChangeStaff3 = (e: any) => {
		state.res3 = e
	};
	const onChangeStaff4 = (e: any) => {
		state.res4 = e
	};
	const onChangeStaff5 = (e: any) => {
		state.res5 = e
	};
</script>

<style scoped>
	.content {
		width: 100%;
		font-size: 28rpx;
	}
	.card {
		padding: 20px;
	}
	.dark {
		background-color: black;
	}
	.dark-select {
		color: white;
	}
	.title {
		font-weight: 600;
		font-size: 24rpx;
		padding-bottom: 10rpx;
	}
	:deep .dark-select .panel {
		background-color: black;
	}
	.box {
		padding: 20px;
	}
	.flex-center {
		display: flex;
		justify-content: center;
		align-items: center;
		height: 600px;
		background: #666;
	}
</style>

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

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

相关文章

Java八股文(设计模式)

Java八股文の设计模式 设计模式 设计模式 什么是设计模式&#xff1f;请列举一些常见的设计模式。 设计模式是软件设计中常用的一种思维模式&#xff0c;它描述了一类具有相似特征和解决思路的问题。 常见的设计模式包括单例模式、工厂模式、观察者模式、装饰器模式等。 请解释…

博士推荐 | 拥有8年以上的材料和电池开发经验的电池材料专家

编辑 / 木子 审核 / 朝阳 伟骅英才 伟骅英才致力于以大数据、区块链、AI人工智能等前沿技术打造开放的人力资本生态&#xff0c;用科技解决职业领域问题&#xff0c;提升行业数字化服务水平&#xff0c;提供创新型的产业与人才一体化服务的人力资源解决方案和示范平台&#x…

2024 年多链代币开发对您的业务有何好处

2024 年&#xff0c;多链代币开发将成为寻求增强数字化影响力并释放区块链领域新机遇的企业的关键战略。通过利用多个区块链&#xff0c;公司可以显着提高其代币的可扩展性、互操作性和安全性。这种方法不仅提高了交易速度并降低了费用&#xff0c;还使企业能够利用更广泛的用户…

港大新工作 HiGPT:一个模型,任意关系类型 !

论文标题&#xff1a; HiGPT: Heterogeneous Graph Language Model 论文链接&#xff1a; https://arxiv.org/abs/2402.16024 代码链接&#xff1a; https://github.com/HKUDS/HiGPT 项目网站&#xff1a; https://higpt-hku.github.io/ 1. 导读 异质图在各种领域&#xf…

编译与链接(想了解编译与链接,那么看这一篇就足够了!)

前言&#xff1a;在我们练习编程的时候&#xff0c;我们只需要将代码写入、运行&#xff0c;就可以得到计算之后的结果了&#xff0c;但是你有没有想过&#xff0c;为什么就可以得到计算之后的结果呢&#xff0c;它的底层又到底是什么呢&#xff1f; ✨✨✨这里是秋刀鱼不做梦的…

气象预测新篇章:Python人工智能的变革力量

Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;在数据处理、科学计算、数学建模、数据挖掘和数据可视化方面具备优异的性能&#xff0c;这些优势使得Python在气象、海洋、地理、气候、水文和生态等地学领域的科研和工程项目中得到广泛应用。可以…

数据结构与算法分析2栈、队列

1.栈和队列本质上都是表&#xff0c;所以他们都有两种实现方式&#xff0c;链表实现和数列实现。栈的特点是后进先出。 2.栈的实现 3.应用有&#xff1a; 4.栈的危险操作&#xff1a;用尽栈空间&#xff0c;导致内容占用到别的寄存器里面去了&#xff0c;从而出现异常。还有尾…

武汉星起航:借亚马逊平台优势助力商家精准营销

在全球经济一体化的背景下&#xff0c;跨境电商已成为推动国际贸易发展的重要引擎。作为跨境电商领域的佼佼者&#xff0c;亚马逊平台以其全球化销售渠道和强大的数据分析能力&#xff0c;为商家提供了前所未有的商机。武汉星起航电子商务有限公司深知亚马逊平台的优势&#xf…

企业为什么要用MES管理系统来升级改造生产车间

随着信息技术的迅猛发展&#xff0c;工业制造领域正经历着深刻的变革。在这个大背景下&#xff0c;MES管理系统的引入和应用&#xff0c;已成为企业升级改造生产车间、提升竞争力的关键手段。本文将从多个维度探讨企业为何要用MES管理系统来升级改造生产车间。 MES管理系统能够…

查询优化-提升子查询-UNION类型

瀚高数据库 目录 文档用途 详细信息 文档用途 剖析UNION类型子查询提升的条件和过程 详细信息 注&#xff1a;图片较大&#xff0c;可在浏览器新标签页打开。 SQL: SELECT * FROM score sc, LATERAL(SELECT * FROM student WHERE sno 1 UNION ALL SELECT * FROM student…

云计算——大模型应用发展的“理想支点”

在数字化浪潮中&#xff0c;人工智能技术的突飞猛进为千行百业带来了前所未有的转型机遇。近期出现的Sora模型能够根据文本描述生成高质量的视频内容&#xff0c;为多领域带来大模型技术飞跃的冲击。如何推进大模型应用&#xff0c;已成为各行业面临的重要课题之一。 打造硬核…

亚信安慧AntDB数据库分布式架构剖析之snapshot sender进程

本文主要介绍亚信安慧AntDB数据库的分布式架构下的特有进程之snapshot sender进程的设计&#xff0c;与snapshot receiver进程是一对&#xff0c;也是分布式架构的核心进程之一。 进程简介 与Snapshot Receiver进程相对应&#xff0c;该进程的作用从整体上看也只包含两个方面&a…

Shopee 4月市场趋势及选品分析,shopee虾皮品类爆款预测

废话不多说&#xff0c;马上进入本周Shopee“现象爆品”、“热门爆品趋势”及“热搜词周榜"版块&#xff0c;帮助商家及时了解Shopee最新市场现状&#xff0c;掌握选品趋势。 1 现象爆品 近几来&#xff0c;为健康“买单”&#xff0c;已经成为全年龄层群体的“刚需”。 图…

第P1周:实现mnist手写数字识别

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制](https://mtyjkh.blog.csdn.net/)** 目录 一、前言 二、我…

青年才俊的聚集地 带你一览DATE 2024会议现场

会议之眼 快讯 第27届欧洲设计、自动化和测试会议&#xff08;Design, Automation and Test in Europe Conference &#xff09;已于2024 年 3 月 25 日-27日在西班牙瓦伦西亚圆满举办&#xff01;DATE第一届会议是在 1998 年在法国巴黎召开的。从那时起&#xff0c;DATE 会议…

ICLR 2024 | FeatUp: A Model-Agnostic Framework for Features at Any Resolution

论文&#xff1a;https://arxiv.org/abs/2403.10516代码&#xff1a;https://github.com/mhamilton723/FeatUp 背景动机 深层特征是计算机视觉研究的基石&#xff0c;捕获图像语义并使社区即使在零或少样本情况下也能解决下游任务。然而&#xff0c;这些特征通常缺乏空间分辨率…

俄罗斯深陷芯片自主困境,良率仅5成 |百能云芯

俄罗斯的芯片产业一直以来都面临着诸多挑战&#xff0c;尤其是在当前的国际形势下&#xff0c;这些挑战更加凸显。随着俄乌冲突的爆发&#xff0c;西方国家对俄罗斯实施了一系列经济制裁&#xff0c;导致俄罗斯科技产业受到了严重影响。据了解&#xff0c;俄国最大的本土芯片厂…

vue3使用vuedraggable实现拖拽(有过渡)

1. 安装与使用 vue中vuedraggable安装&#xff1a; pnpm i -S vuedraggablenext或者 yarn add vuedraggablenext注意&#xff1a;vue2和vue3安装的是不同版本的vuedraggable&#xff0c;写法上也会有一些区别。 比如在vue3中使用拖拽&#xff0c;要以插槽的方式&#xff0c;…

C# 操作 Word 全域查找且替换(含图片对象)

目录 关于全域查找且替换 Word应用样本 SqlServer数据表部分设计样本 范例运行环境 配置Office DCOM 设计实现 组件库引入 实现原理 查找且替换的核心代码 窗格内容 页眉内容 页脚内容 形状内容 小结 关于全域查找且替换 C#全域操作 Word 查找且替换主要包括如下…

GK7205V500国科微 GK7205RNCFV500 GOKE

GK7205V300 芯片是国科针对 IPC 市场推出的新一代支持 H.265 编码的低功耗 IPC SOC 芯片。 该芯片集成专用的 ISP&#xff0c;拥有高效的视频编码处理性能&#xff0c;支持 H.265 编码&#xff0c;满足客户各种差异化业务需求。集 成了 RTC、POR、Audio codec 以及丰富的外设…