小程序app封装公用顶部筛选区uv-drop-down

参考ui:DropDown 下拉筛选 | 我的资料管理-uv-ui 是全面兼容vue3+2、nvue、app、h5、小程序等多端的uni-app生态框架

样式示例:

封装公用文件代码  dropDownTemplete

<template>
	<!-- 顶部下拉筛选区封装公用组件 -->
	<view>
		<uv-drop-down ref="dropDown" sign="dropDown_1" :defaultValue="defaultValue" @click="selectMenu">
			<uv-drop-down-item v-for="(item,index) in uvDropDownItem" :name="item.name" type="2"
				:label="dropItem(item.name,index).label" :value="dropItem(item.name,index).value">
			</uv-drop-down-item>
			<uv-drop-down-item name="more" type="1" label='更多' extra-icon='empty-search' :value="0">
			</uv-drop-down-item>
		</uv-drop-down>
		<uv-drop-down-popup sign="dropDown_1" :click-overlay-on-close="true" :currentDropItem="currentDropItem"
			@clickItem="clickItem"></uv-drop-down-popup>
		<!-- 更多搜索 -->
		<view class="popupPosition">
			<uv-popup ref="popup" :safeAreaInsetTop="true">
				<view class="content">
					<view style="padding: 20rpx;">
						<uv-form labelPosition="left" :model="filterSheetData" ref="form">
							<uv-form-item v-for="(item,index) in formItem" :label="item.label" :prop="item.vModel"
								labelWidth="120" borderBottom width="150rpx" @click="handleItemClick(item)">
								<uv-input v-model="filterSheetData[item.vModel]" disabled disabledColor="#ffffff"
									:placeholder="item.placeholder" border="none"></uv-input>
								<uv-icon v-if="item.selectIcon" name="arrow-right"
									style="float: right;margin-right: 20rpx;"></uv-icon>
							</uv-form-item>

							<uv-button type="primary" text="搜索" customStyle="margin-top: 10px"
								@click="searchSheet"></uv-button>
							<uv-button type="error" text="重置" customStyle="margin-top: 10px"
								@click="resetSearchSheet"></uv-button>
						</uv-form>
					</view>
				</view>
			</uv-popup>
			<uv-popup ref="calendarsPopup" mode="bottom">
				<view class="calendarPopupStyle">
					<view class="cancel" @click="calendarsCancel">
						取消
					</view>
					<view class="confirm" @click="calendarsConfirm">
						确定
					</view>
				</view>
				<uv-calendars ref="calendars" insert mode="range" @confirm="(e)=>timeConfirm(e,calendarsType)"
					@change="(e)=>timeConfirm(e,calendarsType)" />
			</uv-popup>
			<uv-picker v-if="pickerShow" ref="picker" :columns="pickerColumns" keyName="label"
				@confirm="(e)=>pickerConfirm(e,pickerType)" @close="pickerClose"></uv-picker>
			<uv-input v-if="pickerInputShow" placeholder="请输入筛选内容" border="surround" clearable v-model="pickerValue"
				@change="pickerSearchChange" @clear="pickerSearchClear" :customStyle="pickerIptStyle"></uv-input>
		</view>
	</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				// 表示value等于这些值,就属于默认值
				defaultValue: [0, 'all', '0'],
				result: [],
				activeName: '',
				pickerType: "",
				pickerShow: false,
				pickerInputShow: false,
				pickerIptStyle: {
					position: 'fixed',
					bottom: '220px',
					transform: 'translate(-50%)',
					zIndex: 997
				},
				pickerColumns: [
					[{
						label: '数据加载失败',
						id: 0
					}]
				],
				queryParams: {
					json: {
						conditions: [],
						formId: '',
						orderBys: [],
					}
				},
				pickerValue: ''
			}
		},
		props: {
			// 下拉选项数据
			uvDropDownItem: {
				type: Array,
				default: () => ([])
			},
			// 更多下拉选中表单数据
			filterSheetData: {
				type: Object,
				default: () => ({})
			},
			filternetworkData: {
				type: Object,
				default: () => ({})
			},
			filterinitialData: {
				type: Object,
				default: () => ({})
			},
			// 表单项字段
			formItem: {
				type: Array,
				default: () => ([])
			},
			// 更多筛选中下拉数据列表
			olumnscData: {
				type: Array,
				default: () => ([])
			},
		},
		computed: {
			dropItem(name, index) {
				return (name, index) => {
					const result = {};
					const find = this.result.find(item => item.name === name);
					if (find) {
						result.label = find.label;
						result.value = find.value;
					} else {
						result.label = this.uvDropDownItem[index][name].label;
						result.value = this.uvDropDownItem[index][name].value;
					}
					return result;
				}
			},
			// 获取当前下拉筛选项
			currentDropItem() {
				let data = this.uvDropDownItem.find(item => item.name === this.activeName)
				// console.log(data&&data.name);//拿到name字段
				// console.log(data&&data[data.name]);//获取name字段中的数组
				return data && data[data.name]
			}
		},
		created() {},
		methods: {
			// 更多筛选中表单点击事件
			handleItemClick(item) {
				if (item.selectIcon) {
					if (item.type === 'text') {
						this.chooseSearchSelect(item.vModel);
					} else if (item.type === 'time') {
						this.chooseSearchTime(item.vModel);
					}
				}
			},
			// 选择内容(下拉选)
			chooseSearchSelect(type) {
				this.pickerType = type
				this.pickerColumnsAssignment()
				this.pickerShow = true
				this.$nextTick(() => {
					this.$refs.picker.open();
				})
				setTimeout(() => {
					this.pickerIptStyle['left'] = window.innerWidth / 2 + 'px'
					this.pickerInputShow = true
				}, 300)
			},
			pickerColumnsAssignment() {
				this.olumnscData.forEach(item => {
					if (item.name == this.pickerType) {
						this.$set(this.pickerColumns, 0, item.list)
					}
				})
			},
			// 快速过滤选择项
			pickerSearchChange(e) {
				if (e === '') {
					this.pickerColumnsAssignment()
				} else {
					this.olumnscData.forEach(item => {
						if (item.name == this.pickerType) {
							this.$set(this.pickerColumns, 0, item.list.filter((item) => item.label.includes(e)))
						}
					})
				}
			},
			// 快速过滤选择项清除
			pickerSearchClear() {
				this.pickerColumnsAssignment()
			},
			// 选择项确定
			pickerConfirm(e, type) {
				this.filternetworkData[type] = e.value[0]
				this.filterSheetData[type] = e.value[0].label
			},
			// 选择项取消
			pickerClose() {
				this.pickerShow = false
				this.pickerInputShow = false
			},
			// 选择时间
			chooseSearchTime(type) {
				this.calendarsType = type
				this.$refs.calendarsPopup.open();
			},
			// 选择时间取消
			calendarsCancel() {
				this.filternetworkData[this.calendarsType] = ""
				this.filterSheetData[this.calendarsType] = ""
				this.$refs.calendarsPopup.close();
			},
			// 选择时间确定
			calendarsConfirm() {
				this.$refs.calendarsPopup.close();
			},
			timeConfirm(e, type) {
				this.filternetworkData[type] = e.range
				this.filterSheetData[type] = e.range.before + ' / ' + e.range.after
			},
			//更多--搜索
			searchSheet() {
				this.queryParams.json.conditions = []
				this.formItem.forEach(item => {
					// 判断查询表单项是否有值
					if (this.filternetworkData[item.vModel]&&item.type=='text') {
						// 如果value有值说明是对象格式  将value值传递
						if (this.filternetworkData[item.vModel].value) {
							this.queryParams.json.conditions.push({
								field: item.vModel,
								operation: "like",
								value: this.filternetworkData[item.vModel].value
							})
							// 如果只是字段有值 说明是文本框
						} else {
							this.queryParams.json.conditions.push({
								field: item.vModel,
								operation: "like",
								value: this.filternetworkData[item.vModel]
							})
						}
					}
					if (this.filternetworkData[item.vModel]&&item.type=='time') {
						this.queryParams.json.conditions.push({
							field: item.vModel,
							operation: "<>",
							value: this.filternetworkData[item.vModel].before,
							value2: this.filternetworkData[item.vModel].after
						})
					}
				})
				this.$refs.popup.close()
				// 将查询条件传递给父组件
				this.$emit('searchSheet', this.queryParams.json)
			},
			resetSearchSheet() {
				this.$emit('resetSearchSheet')
				this.queryParams.json.conditions = []
				this.$refs.popup.close()
			},
			/**
			 * 点击每个筛选项回调
			 * @param {Object} e { name, active, type } = e
			 */
			selectMenu(e) {
				const {
					name,
					active,
					type
				} = e;
				this.activeName = name;
				// type 等于1 的需要特殊处理:type不等于1可以忽略
				if (type == 1) {
					this.$refs.popup.open('top');
				} else {
					// 找到 name 属性等于 this.activeName 的对象
					const dropDownItem = this.uvDropDownItem.find(item => item.name === this.activeName);
					if (dropDownItem) {
						const find = this.result.find(item => item.name == this.activeName);
						if (find) {
							const findIndex = dropDownItem.child.findIndex(item => item.label == find.label && item
								.value == find.value);
							dropDownItem.activeIndex = findIndex;
						} else {
							dropDownItem.activeIndex = 0;
						}
					}
				}
			},
			/**
			 * 点击菜单回调处理
			 * @param {Object} item 选中项 { label,value } = e
			 */
			clickItem(e) {
				// 下面有重新赋值,所以用let
				let {
					label,
					value
				} = e;
				const findIndex = this.result.findIndex(item => item.name == this.activeName);
				if (this.defaultValue.indexOf(value) > -1 && this[this.activeName].label) {
					label = this[this.activeName].label;
				}
				// 已经存在筛选项
				if (findIndex > -1) {
					this.$set(this.result, findIndex, {
						name: this.activeName,
						label,
						value
					})
				} else {
					this.result.push({
						name: this.activeName,
						label,
						value
					});
				}
				this.result = this.result.filter(item => this.defaultValue.indexOf(item.value) == -1);
				this.result.forEach(item => {
					if (item.name) {
						if (item.label == '全部') {
							if (this.queryParams.json.conditions.length) {
								this.queryParams.json.conditions.forEach((itens,indexs)=>{
									if(itens.field === item.name){
									this.queryParams.json.conditions.splice(indexs,1)
									}
								})	
							}
						} else {
							// 添加筛选参数
							if (this.queryParams.json.conditions.length) {
								this.queryParams.json.conditions.forEach((itens,indexs)=>{
									if(itens.field === item.name){
									this.queryParams.json.conditions.splice(indexs,1)
									}
								})
								this.queryParams.json.conditions.push({
									field: item.name,
									operation: "=",
									value: item.value
								})
								
							} else {
								this.queryParams.json.conditions.push({
									field: item.name,
									operation: "=",
									value: item.value
								})
							}
						}
					}
				})
// 将查询条件传递给父组件
				this.$emit('searchSheet', this.queryParams.json)
			},
		}
	}
</script>

<style lang="scss" scoped>
	// 下拉选项滚动区域
	::v-deep .uv-dp__container {
		height: 400rpx !important;
		overflow-y: auto;
	}

	uni-view[data-v-4cc3c370] {
		top: 0 !important;
	}

	.calendarPopupStyle {
		display: flex;
		justify-content: space-between;
		border-bottom: 1rpx solid #ccc;

		>view {
			font-size: 34rpx;
			color: #909399;
			padding: 20rpx 20rpx;
		}
	}
</style>

父组件调用:

<view class="header-fixed">
			<dropDownTemplete :uvDropDownItem="uvDropDownItem" :filterSheetData="filterSheetData" :filternetworkData="filternetworkData" 
			:filterinitialData="filterinitialData" :formItem="formItem" :olumnscData="olumnscData" @searchSheet="searchSheet" @resetSearchSheet="resetSearchSheet"></dropDownTemplete>
		</view>

data数据:

// 下拉选项数据
				uvDropDownItem: [{
						name: 'brand',
						brand: {
							label: '品牌',
							value: 'all',
							activeIndex: 0,
							color: '#333',
							activeColor: '#2878ff',
							child: [{
								label: '全部',
								value: 'allto'
							}]
						},
					},
					{
						name: 'categoryId',
						categoryId: {
							label: '品类',
							value: 'all',
							activeIndex: 0,
							color: '#333',
							activeColor: '#2878ff',
							child: [{
								label: '全部',
								value: 'allto'
							}]
						}
					}
				],
				// 更多下拉选项数据
				formItem:[
					{
						label:'品类',
						vModel:'categoryId',
						type:'text',
						placeholder:'请选择品类',
						selectIcon:true
					},
					{
						label:'品牌',
						vModel:'brand',
						type:'text',
						placeholder:'请选择品牌',
						selectIcon:true
					},
					{
						label:'更新时间',
						vModel:'updateTime',
						type:'time',
						placeholder:'请选择更新时间',
						selectIcon:true
					},
					{
						label:'创建时间',
						vModel:'createTime',
						type:'time',
						placeholder:'请选择创建时间',
						selectIcon:true
					}
				],
				filterSheetData: {
					categoryId: "",
					brand: "",
					updateTime: "",
					createTime: ""
				},
				filternetworkData: {
					categoryId: "",
					brand: "",
					updateTime: "",
					createTime: ""
				},
				filterinitialData: {
					categoryId: "",
					brand: "",
					updateTime: "",
					createTime: ""
				},
				olumnscData:[
					{
						name:'categoryId',
						list:[
						{label:'1',vaule:'fff'},
						{label:'2',vaule:'dfvdgf'}
					],
					},
					{
						name:'brand',
						list:[
						{label:'里奈',vaule:'里奈'},
						{label:'舞曲',vaule:'舞曲'}
					],
					}
				]

搜索和清除事件:

// 更多-搜索
			searchSheet(data){
				console.log(data);
				//这里可进行搜索操作
			},
			// 更多-清除
			resetSearchSheet(){
				// 清空数据
				this.filterSheetData = this.filterinitialData
				this.filternetworkData = {
					categoryId: {label:'',value:''},
					brand: {label:'',value:''},
					updateTime: "",
					createTime: ""
				}
			},

最终样式图示例:

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

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

相关文章

3 JDK 常见的包和BIO,NIO,AIO

JDK常见的包 java.lang:系统基础类 java.io:文件操作相关类&#xff0c;比如文件操作 java.nio:为了完善io包中的功能&#xff0c;提高io性能而写的一个新包 java.net:网络相关的包 java.util:java辅助类&#xff0c;特别是集合类 java.sql:数据库操作类 IO流 按照流的流向分…

Uniapp 手机基座调试App 打包成Apk文件,并上传到应用商店

1.Uniapp手机基座调试App。 1.1 以下是我另一篇文章 讲解 uniapp连接手机基座调试App、 Hbuildx使用SUB运行到手机基座测试_hbuilder基座-CSDN博客 2.打包本地的uniapp项目为apk文件。 打包的方式有很多种&#xff0c;我们可以选择本地打包和远程云端打包两种方式。 我们在打包…

vue调试工具 Vue.jsDevtools

文件下载 Vue.js Devtools 通过网盘分享的文件&#xff1a;ddebf336f8a44293bd4db9d0f287bc1c.crx 链接: https://pan.baidu.com/s/1uS3a49CwW-B000p5GwUQmQ 提取码: ko89 下载完了 &#xff0c;拖入chrome里&#xff0c;打开详情配置. 打开红框中的开关 重启浏览器&#xff…

数智化时代医院临床试验人才培养的创新路径与实践探索

一、引言 1.1 研究背景与意义 在当今数实化与智能化技术飞速发展的时代&#xff0c;医疗行业正经历着深刻的变革&#xff0c;数智化医院已成为未来发展的重要趋势。临床试验作为药物研发、医疗器械验证以及医疗技术创新的关键环节&#xff0c;对于推动医学进步、提高医疗质量…

产品更新 | 一网联千策:华望M-Cowork平台上的SysML模型协同管理

华望产品更新速递 功能介绍 | 协同平台M-Cowork的强大功能 ◆在线SysML建模与预览 ◆版本控制和基线管理 ◆可追溯的审签流程 ◆全面的系统管理 产品亮点 | 进一步了解协同平台M-Cowork ◆M-Cowork的管理功能 ◆M-Cowork的预览功能 ◆M-Cowork的审签流程 前言 在系统工…

纯相位全息图优化算法综述

◀ 背景引入 ▶ 近年来&#xff0c;得益于光学、电子和计算机等各项技术的进步以及新算法的不断提出&#xff0c;计算全息技术飞速发展。由于现有液晶空间光调制器对于纯相位全息图具有更高的调制能力与衍射效率&#xff0c;纯相位全息图优化算法一直以来都是研究热点。目前&…

Unity复刻胡闹厨房复盘 模块一 新输入系统订阅链与重绑定

本文仅作学习交流&#xff0c;不做任何商业用途 郑重感谢siki老师的汉化教程与代码猴的免费教程以及搬运烤肉的小伙伴 版本&#xff1a;Unity6 模板&#xff1a;3D 核心 渲染管线&#xff1a;URP ------------------------------…

CentOS 7 安装、测试和部署FastDFS

目录 FastDFS环境搭建 安装 libfastcommon 库 安装FastDFS 查看编译后的文件 FastDFS配置 FastDFS启动 启动tracker服务 启动storage服务 查看storage是否已经注册到了tracker下 查看存储文件的目录 FastDFS重启 FastDFS关闭 使用fdfs_test进行测试 修改client.co…

通用导出任何对象列表数据的excel工具类

在工作中经常会遇到列表数据的导出&#xff0c;每次需要的时候都要去开发一次&#xff0c;且数据不断在变化&#xff0c;于是就有了下述的工具类&#xff0c;可传入各种实体对象的List&#xff0c;最终以指定格式导出excel&#xff0c;废话不多说&#xff0c;上代码~ 控制层代…

前端:改变鼠标点击物体的颜色

需求&#xff1a; 需要改变图片中某一物体的颜色&#xff0c;该物体是纯色&#xff1b; 鼠标点击哪个物体&#xff0c;哪个物体的颜色变为指定的颜色&#xff0c;利用canvas实现。 演示案例 代码Demo <!DOCTYPE html> <html lang"en"><head>&l…

AI口播数字人系统快速搭建方法来袭!零经验小白也能学会!

随着AI口播数字人的身影在短视频和直播中的出现频率持续升高&#xff0c;越来越多的创业者都察觉到了AI口播数字人系统所蕴含着的巨大潜在用户规模和广阔收益前景&#xff0c;并打听起了AI口播数字人系统怎么搭建相关的各种消息。 毕竟&#xff0c;根据当前的使用情况来看&…

中小学生心理健康测评系统:精准洞察,助力成长!

随着社会的发展&#xff0c;中小学生的心理健康问题日益受到关注。国家出台了一系列政策&#xff0c;强调要加强学生心理健康教育。然而&#xff0c;在实际的校园环境中&#xff0c;中小学生面临着各种各样的心理挑战&#xff0c;课程增多、难度加大&#xff0c;考试频繁&#…

2024年12月英语六级CET6写作与翻译笔记

目录 1 写作 1.1 大学为学生提供了探索各种可能性 1.2 自律在个人成长中的重要性 1.3 切实可行的目标 2 翻译 2.1 洋山港(Yangshan Port) 2.2 中国航天事业 2.3 北斗卫星导航系统 1 写作 1.1 大学为学生提供了探索各种可能性 1.2 自律在个人成长中的重要性 1.3 切实可…

Unity性能优化 --- 减少OverDraw

OverDraw(过度绘制)就是GPU多次重复绘制同一像素点的操作。在Unity 中渲染的图像由数百万个像素组成&#xff0c;如果这些像素被多次绘制&#xff0c;那么会造成GPU极大的性能损耗。例如下图多个物体叠加放在一起 注&#xff1a;棕色越深的地方&#xff0c;过度绘制的次数越多。…

PostgreSQL 的历史

title: PostgreSQL 的历史 date: 2024/12/23 updated: 2024/12/23 author: cmdragon excerpt: PostgreSQL 是一款功能强大且广泛使用的开源关系型数据库管理系统。其历史可以追溯到1986年,当时由加州大学伯克利分校的一个研究团队开发。文章将深入探讨 PostgreSQL 的起源、…

python学opencv|读取图像(二十一)使用cv2.circle()绘制圆形进阶

【1】引言 前序已经掌握了使用cv2.circle()绘制圆形的基本操作&#xff0c;相关链接为&#xff1a; python学opencv|读取图像&#xff08;二十&#xff09;使用cv2.circle()绘制圆形-CSDN博客 由于圆形本身绘制起来比较简单&#xff0c;因此可以自由操作的空间也就大&#x…

大数据-256 离线数仓 - Atlas 数据仓库元数据管理 正式安装 启动服务访问 Hive血缘关系导入

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…

保险科技“数智化+”赋能险企高质量发展

文 / 太保科技有限公司人工智能服务事业群资深产品经理 娄昕盛 中国太平洋保险(集团)股份有限公司数智研究院人工智能首席专家 徐国强 中国太平洋保险(集团)股份有限公司数智研究院执行院长 王磊 近年来,保险科技正处在“数字化+”向“数智化+”发展的过渡阶段,…

AI科研助手开发总结:向量与数据权应用(二)

一、前言 继上篇文章&#xff1a;AI科研助手开发总结&#xff1a;向量与数据权限的应用&#xff08;一&#xff09; 本章根据向量库内存储数据及权限&#xff0c;向量库统一维护和管理数据权限方案讨论。 二、方案分析-基于向量Fields 2.1 思路 结合橙语AI科研助手的业务场…

数字逻辑(七)——逻辑运算中三种基本运算及其符合运算

目录 1 三种基本逻辑运算 1.1 与&#xff08;AND&#xff09; 1.2 或&#xff08;OR&#xff09; 1.3 非&#xff08;NOT&#xff09; 2 由基本门电路组成的其他门电路 2.1 异或 2.2. 同或 2.3 与非 2.4 或非 用于分析数字电路中逻辑功能的数学方法——逻辑代数&#…