多条件查询展开收起

顶部筛选条件很多时,就需要对赛选条件进行分组,每组都要有展开收起,根据页面自定义,还需要显示收起查询中有几条查询中的内容

思路: 封装一个组件,利用插槽自定义查询条件和分组

// 子组件
<script setup>
import { onMounted, onUnmounted, ref } from 'vue'const props = defineProps({/*** data [{  slot: '', name: ''}]*/data: {type: Array,required: true,default: () => {return []}},labelStyle: {type: Object,default: () => {return {}}}
})const slotWrapperConfig = ref({})const buttonCommonConfig = {0: {text: '收起',iconClass: 'el-icon-arrow-up'},1: {text: '展开',iconClass: 'el-icon-arrow-down'},btnId: '_btn',btnChild: {spanId: '_child_span',iconId: '_child_icon'}
}const setSlotWrapper = () => {for (let i of props.data) {const slotWrapper = document.getElementById(i.slot)let btnStatus = 1const s = slotWrapperConfig.value[i.slot]if (s && s.hasOwnProperty('btnStatus')) {btnStatus = s.btnStatus}slotWrapperConfig.value[i.slot] = {el: slotWrapper,offsetWidth: slotWrapper.offsetWidth,children: slotWrapper.children,selected: 0,btnStatus}}
}const setMarkAndButton = () => {for (let k in slotWrapperConfig.value) {let child = slotWrapperConfig.value[k].childrenlet w = 0let l = []for (let i of child) {i.mr = parseFloat(window.getComputedStyle(i).marginRight)i.w = i.offsetWidth || i.ww += i.w + i.mrif (w > slotWrapperConfig.value[k].offsetWidth) {if (i.type !== 'button') {i.id = 'collapse'l.push(i)if (slotWrapperConfig.value[k].btnStatus === 1) {i.style.display = 'none'}}} else {if (i.outerHTML.includes('date')) {i.style.display = 'inline-flex'} else {i.style.display = 'block'}if (i.type !== 'button') {i.id = ''}}}slotWrapperConfig.value[k].collapse = lslotWrapperConfig.value[k].selected = getSelectedNum(slotWrapperConfig.value[k].collapse)const {btnId} = buttonCommonConfigif (slotWrapperConfig.value[k].collapse.length > 0) {slotWrapperConfig.value[k].button = createButton({btnId: `${k}${btnId}`,conf: slotWrapperConfig.value[k],btnClick: () => {for (let i of slotWrapperConfig.value[k].children) {if (slotWrapperConfig.value[k].btnStatus) {if (i.outerHTML.includes('date')) {i.style.display = 'inline-flex'} else {i.style.display = 'block'}} else {if (i.id === 'collapse') {i.style.display = 'none'}}}slotWrapperConfig.value[k].btnStatus = Number(!slotWrapperConfig.value[k].btnStatus)slotWrapperConfig.value[k].selected = getSelectedNum(slotWrapperConfig.value[k].collapse)changeButtonChild(`${k}${btnId}`, slotWrapperConfig.value[k])}})changeButtonChild(`${k}${btnId}`, slotWrapperConfig.value[k])const btnEl = document.getElementById(`${k}${btnId}`)if (!btnEl) {slotWrapperConfig.value[k].el.append(slotWrapperConfig.value[k].button)}} else {const btnEl = document.getElementById(`${k}${btnId}`)if (btnEl) {btnEl.remove()}}}
}const changeButtonChild = (btnId, conf) => {let t = ''if (conf.selected > 0 && conf.btnStatus === 1) {t = ` 已选(${conf.selected})个`}const {btnChild: {spanId, iconId}} = buttonCommonConfiglet btnSpan = document.getElementById(`${btnId}${spanId}`)if (btnSpan) {btnSpan.innerText = `${buttonCommonConfig[conf.btnStatus].text}${t}`}let btnIcon = document.getElementById(`${btnId}${iconId}`)if (btnIcon) {btnIcon.className = buttonCommonConfig[conf.btnStatus].iconClass}
}const createButton = (options) => {let {btnId} = optionsif (!btnId) {return}let btn = document.createElement('button')btn.id = btnIdbtn.type = 'button'btn.className = 'el-button el-button--default el-button--small'const {btnChild: {spanId, iconId}} = buttonCommonConfiglet btnSpan = document.createElement('span')btnSpan.id = `${btnId}${spanId}`let btnIcon = document.createElement('i')btnIcon.id = `${btnId}${iconId}`let t = ''if (options.conf.selected > 0) {t = ` 已选(${options.conf.selected})个`}btnSpan.innerText = `${buttonCommonConfig[options.conf.btnStatus].text}${t}`btnIcon.className = buttonCommonConfig[options.conf.btnStatus].iconClassfor (let i of [btnSpan, btnIcon]) {btn.append(i)}btn.onclick = () => options.btnClick()return btn
}const getSelectedNum = (list) => {const c = _.compact(_.map(list, i => {if (typeof i.__vue__.value === 'object') {if (!_.isEmpty(i.__vue__.value)) {return i.__vue__.value}} else {if (i.__vue__.value === 0) {return 1}return i.__vue__.value}}))return c.length
}const init = () => {setSlotWrapper()setMarkAndButton()
}onMounted(() => {init()window.addEventListener('resize', init)
})onUnmounted(() => {window.removeEventListener('resize', init)
})</script><template><div class="search_wrapper"><div v-for="item in data" class="list_item"><div><div class="name" :style="labelStyle">{{ item.name }}</div></div><div :id="item.slot" class="slot_item"><slot :name="item.slot"></slot></div></div></div>
</template><style lang="scss">
.search_wrapper {.list_item {display: flex;.name {width: 50px;height: 32px;line-height: 32px;margin: 10px 10px 0 0;color: #333333;font-size: 15px;font-weight: 600;text-align: right;}}.slot_item {width: 100%;display: flex;flex-wrap: wrap}
}
</style>
<template><div class="user-box"><div><v-SearchBar :data="slotData" :labelStyle="{width: 'max-content', fontWeight: '400', fontSize: '14px'}"><template #laiyuan>...添加筛选条件就可以了</template ></v-SearchBar></div></div>
</template>// 父
组件
data () {
return {
slotData: [{name:'来源',slot:'laiyuan',},{name:'状态',slot:'status',},{name:'产品',slot:'product'},{name:'用户',slot:'admin'},{name:'时间',slot:'time'},],
}
}

最终效果
在这里插入图片描述

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

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

相关文章

智能枪弹柜管理系统-智能枪弹管理系统DW-S306

随着社会的发展和治安形势的日益严峻&#xff0c;对于枪弹的管理变得尤为重要。传统的手工记录和存放方式已经无法满足现代化、高效化、安全化的需求。因此&#xff0c;智能枪弹柜管理系统应运而 生。 在建设万兆主干、千兆终端的监控专网的基础上&#xff0c;弹药库安全技术…

MySQL数据库进阶第四篇(视图/存储过程/触发器)

文章目录 一、视图简单介绍与基础语法二、视图的检查选项三、视图的更新四、视图的作用五、存储过程的概念与特点六、存储过程的 创建&#xff0c;调用&#xff0c;查看&#xff0c;删除七、存储过程 — 系统变量八、存储过程 — 用户定义变量九、存储过程 — 局部变量十、存储…

最便宜也能最安全:Positive SSL证书

PositiveSSL证书的优势 价格实惠&#xff1a;相较于其他品牌的SSL证书&#xff0c;PositiveSSL证书的价格更为亲民。这使得小型企业和个人网站也能够轻松采用SSL加密技术&#xff0c;提高网站的安全性。安全性能可靠&#xff1a;虽然价格便宜&#xff0c;但PositiveSSL证书在安…

CMake和VsCode调试的使用

目录 CMake使用 CMake下载 创建系统文件目录 MakeList编写规范 VsCode启动调试 添加配置文件 添加断点&#xff0c;启动调试 CMake使用 CMake下载 输入指令 sudo apt install cmake 安装cmake&#xff0c;使用 cmake -version可查看cmake的版本信息 创建系统文件目…

unity导航网格无法烘培到台阶和斜坡

如图是我在b站学Unity导航网格时建的一个示例场景&#xff0c;本场景使用的为棱长1m的立方体&#xff0c;读者可以以此为参照度量其他物体大小。 可见导航网格根本无法烘焙到斜坡和台阶上&#xff0c;为解决问题我做了不少尝试&#xff0c;调整最大坡度和步高都没办法解决问题…

图像复原天花板!IR开创性新作实现最佳视觉质量,修复更智能、更逼真

图像复原&#xff08;IR&#xff09;指在已知图像退化的原因和模型的情况下&#xff0c;通过一系列的逆过程来恢复出原始图像的过程。这是一个长期的低级视觉任务&#xff0c;也是图像处理领域的一个重要课题。 随着深度学习技术的发展&#xff0c;图像复原领域不断出现新的网…

鸿蒙开发—【扩展textinput组件】

扩展鸿蒙textinput组件&#xff0c;支持快速扩展展性&#xff0c;标题文本等&#xff0c;文本内容双向绑定、文本组件快速复用。 /*** 单选文本*/ Component export default struct DiygwInput{//绑定的值Link value:string;//未选中图标State labelImg: Resource $r(app…

振动解调用的包络谱计算

1缘起 在振动分析中&#xff0c;对于一些高频频点的分析计算&#xff0c;使用包络谱技术&#xff0c;进而得到特化谱是最适宜的。我们看matlab信号分析中提供的一个实例&#xff1a; https://www.mathworks.com/help/signal/ug/compute-envelope-spectrum.html 轴承故障有4个…

GB28181视频监控平台EasyCVR如何通过配置实现级联不响应下级平台的检索消息?

AI视频智能分析/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff08;专网、内网、局域网、广域网、公网等&#xff09;将前端海量的设备进行统一集中接入与视频汇聚管理&#xff0c;平台支持设备通过4G、5G、WIFI、有线等方式进行视频流的快捷接入和传输。平台能将接入的…

海外智能充电桩系统开发: 助力您的新能源业务扬帆起航

一、市场趋势&#xff1a;海外新能源汽车市场蓬勃发展 近年来&#xff0c;全球新能源汽车市场呈现爆发式增长态势&#xff0c;各国政府纷纷出台政策鼓励新能源汽车发展&#xff0c;消费者对新能源汽车的接受度也不断提高。根据国际能源署&#xff08;IEA&#xff09;预测&…

3 Nacos源码下载并集成达梦数据库驱动

1、Nacos源码下载 源码直接下载gitee上的nacos2.2.3,具体链接:Nacos: 概览 欢迎来到 Nacos 的世界! Nacos 致力于帮助您发现、配置和管理微服务 - Gitee.com,具体如下图

数学建模【GM(1, 1)灰色预测】

一、GM(1, 1)灰色预测简介 乍一看&#xff0c;这个名字好奇怪&#xff0c;其实是有含义的 G&#xff1a;Grey&#xff08;灰色&#xff09;M&#xff1a;Model&#xff08;模型&#xff09;(1, 1)&#xff1a;只含有一个变量的一阶微分方程模型 提到灰色&#xff0c;就得先说…