从零开始Vue3+Element Plus后台管理系统(八)——模仿禅道做一个Vue3版本的高级查询组件

news2024/11/28 23:51:29

image.png

暗黑模式

image.png

使用 Vue3+element Plus 简单模仿了禅道系统的高级搜索组件,说简单也有点复杂,还没有完全开发完,但是大体架子有了,剩下一些功能点继续coding。边开发边记录吧,因为这个相比之前的内容确实复杂一些,也更接地气。

大概的功能如下图

image.png

主要思路

这是一个相对复杂的组件,所以拆分成了多个文件,主要有3个:

  1. 主要区域,用于显示和设置搜索条件
  2. 右侧,保存的搜索方案,可以切换搜索方案(主区域的条件跟着变化)
  3. 保存搜索方案的弹窗

image.png

备选搜索项是一个数组,包含所有可选的条件,可以来自于接口,也可以前端自行定义,此处我在前端定义了几个数据用于DEMO演示

备选搜索项和默认搜索方案经过处理,获得一个初始展示的条件列表,如果列表有数据,那么就会展示默认设置的条件,表单内容显示为空。

当用户设置完搜索条件后,可以点击搜索,也可以保存到自定义的查询方案。查询方案保存在localstorage中

文件结构如下图

image.png

代码比较多,下面贴出来比较重要的部分。

主要搜索条件区域

搜索条件表单,默认是6个,数据通过备选搜索项和默认查询方案得来。

如果没有需要默认展示的条件,6个搜索条件都是空的,

// 备选参与搜素的项目
let listColumns = reactive<SearchColumnItem[]>([])
listColumns = demoList

// 初始渲染的搜索条件, 还未加入查询方案的影响
let defaultColumns = reactive<SearchColumnItem[]>(listColumns.filter((cur) => cur.default))
              <ul>
                <li
                  v-for="(i, index) in maxCount"
                  :key="i"
                  :class="index < showCount ? 'flex' : 'hidden'"
                >
                  <SearchItem
                    :columns="listColumns"
                    :defaultColumn="defaultColumns[index]"
                    :index="index"
                    :ref="(el:any) => setRef(el, index)"
                  />
                </li>
              </ul>

单个搜索条件继续拆分成子组件 SearchItem.vue

image.png

<template>
  <el-select v-if="index > 0" v-model="formData.andOr" class="mr-1 w-[80px] flex-shrink-0">
    <el-option v-for="ao in andOrOptions" :key="ao.value" :label="ao.label" :value="ao.value" />
  </el-select>

  <el-select class="mr-1 w-[150px] flex-shrink-0" v-model="formData.code" @change="changeCode">
    <el-option v-for="c in columns" :key="c.code" :label="c.label" :value="c.code" />
  </el-select>

  <el-select
    class="mr-1 w-[100px] flex-shrink-0"
    v-model="formData.condition"
    @change="changeCondition"
    ><el-option v-for="c in conditionOptions" :key="c.value" :label="c.label" :value="c.value"
  /></el-select>

  <component
    :disabled="disabled"
    class="flex-1"
    :is="ctOptions[formData.type as keyof typeof ctOptions]"
    v-model:value="formData.value"
  ></component>
</template>

其中component对应的是formComponents下的文件,在父组件中根据搜索项的配置,用component使用对应输入组件。

这些是用户输入的组件,之所以分成多个组件,一是简单清晰,而是方便扩展自定义组件。目前只放了几个基础的element plus的组件。

渲染搜索条件使用的数据格式如下,可以根据需要自行修改增加

export default [
  {
    label: '用户名',
    code: 'name',
    type: 'input',
    condition: 'equal',
    default: true
  },
...
]

export const andOrOptions = [
  {
    value: 'and',
    label: '并且'
  },
  {
    value: 'or',
    label: '或者'
  }
]

export const conditionOptions = [
  {
    value: 'equal',
    label: '等于'
  },
  {
    value: 'notEqual',
    label: '不等于'
  },
...
]

多个同名ref的处理

点击搜索时,会获取6个子组件的数据,组合成searchParams,Vue2中我们可以使用多个同名ref,然后使用this.$refs来遍历数据,Vue3在循环生成ref时和Vue2有一些不同,稍稍麻烦一点。

不过这里我又小小卡住了一会———开始setRef方法保存的是对象,结果每次点击搜索按钮,itemRefs数组的length就翻一倍,无解,最后该用现在的写法使用数组保存,保证ref不会超出预期数量。


<SearchItem
                :columns="listColumns"
                :defaultColumn="defaultColumns[index]"
                :index="index"
                :ref="(el:any) => setRef(el, index)"
              />
              
              
...
              
let itemRefs: Array<any> = []
function setRef(el: HTMLElement | ComponentPublicInstance, index: number) {
  itemRefs[index] = el
}

// 搜索时遍历获取子组件数据
function search() {
  searchParams.params = []
  itemRefs.forEach((element) => {
    if (element?.formData?.code) {
      searchParams.params.push(element.formData)
    }
  })
}

只要捋清了各个功能点,合适拆分子组件,复杂的组件也可以变简单!

有了你的赞👍,我会更努力😄

本项目GIT地址:github.com/lucidity99/…

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

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

相关文章

Java的基操,基操(一)

&#x1f525;二进制&#x1f525;二进制和十进制的转化&#x1f525;注释&#x1f525;标识符&#x1f525;关键字/保留字&#x1f525;变量(variable) &#x1f525;二进制 二进制&#xff0c;是计算技术中广泛采用的一种数制&#xff0c;由德国数理哲学大师莱布尼茨于 1679 …

Helm chart 常用命令以及原理和生产实践

问: 到哪里去搜索helm package? 答: artifacthub.io Helm 的实质就是搞一些模版&#xff0c;最终依据这些模版生成k8s的系列yaml文件(deployemnt,service,secret,map等等),从而在k8s上能够简单部署出完整应用。可以用helm template查看最终生成的k8s部署文件。 helm version…

MQTT客户端应用编程及接口分析

MQTT客户端应用编程及接口分析 MQTT协议简介 MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的&#xff0c;这些特点使它适用范围非常广泛。 客户端服务端安装 1.安装 sudo apt-add-repository ppa:mosquitto-dev/mosquitto-…

SpringCloud_服务注册中心_Consul(八)

SpringCloud_服务注册中心_Consul(八) 分为五部分 Consul简介 安装并运行Consul 服务提供者 服务消费者 三个注册中心异同点 Consul简介 官网&#xff1a;https://developer.hashicorp.com/consul/docs/intro 是Go语言写的 Consul是一套开源的分布式服务发现和配置管理系统&am…

GB50312-2016标准中需要检测的参数(AEMFLUKE)含双绞线和光

很多同学经常搞不清GB50312-2016标准的规定测试参数&#xff0c;或者说和测试设备对不上号。特意从标准中摘抄出来&#xff0c;供大家参考。 ACR-F(Attenuation to Crosstalk Ratio at the Far-end) 衰减远端串音比 ACR-N(Attenuation to Crosstalk Ratio at the Near-end)衰…

用于申威Alpha指令集处理器CModel裸机(不带操作系统)的CoreMark性能测试程序源码编译流程

CoreMark是一个综合基准&#xff0c;用于测量嵌入式系统中使用的中央处理器(CPU)的性能。它是在2009由eembc的shay gal-on开发的&#xff0c;并且试图将其发展成为工业标准&#xff0c;取代过时的dehrystone基准。代码用C编写&#xff0c;包含以下算法&#xff1a;列表处理(增删…

如何在Colab中使用gpu资源(附使用MMdet推理示例)

如何在Colab中“白嫖”gpu资源&#xff08;附使用MMdet推理示例&#xff09; Google Colab简介 当今&#xff0c;深度学习已经成为许多人感兴趣的话题&#xff0c;Google Colab&#xff08;全称为Google Colaboratory&#xff09;是Google推出的一个强大的云端 notebook&…

《微服务实战》 第七章 Spring Cloud 之 GateWay

前言 API 网关是一个搭建在客户端和微服务之间的服务&#xff0c;我们可以在 API 网关中处理一些非业务功能的逻辑&#xff0c;例如权限验证、监控、缓存、请求路由等。 1、通过API网关访问服务 客户端通过 API 网关与微服务交互时&#xff0c;客户端只需要知道 API 网关地…

UWB智慧工厂人员定位系统源码,人员在岗监控、车辆实时轨迹监控源码

近年来人员定位系统在工业领域的发展势头迅猛&#xff0c;工业识别与定位成为促进制造业数字化的关键技术。通过实时定位可以判断所有的人、物、车的位置。实时定位系统要适用于复杂工业环境&#xff0c;单一技术是很难实现的&#xff0c;需要融合多种不同的定位技术&#xff0…

【hive】hive grouping sets和GROUPING__ID的用法

前言​ GROUPING SETS,GROUPING__ID,CUBE,ROLLUP 这几个分析函数通常用于OLAP中&#xff0c;不能累加&#xff0c;而且需要根据不同维度上钻和下钻的指标统计&#xff0c;比如&#xff0c;分小时、天、月的UV数。 grouping sets根据不同的维度组合进行聚合&#xff0c;等价于…

从事网络安全工作,这五大证书是加分项!

对我们而言&#xff0c;无论从事什么工作&#xff0c;考取相关证书都有非常重要的作用&#xff0c;它是我们找工作时的加分项&#xff0c;同时也是对我们技术水平的验证&#xff0c;那么从事网络安全工作可以考哪些证书?本篇文章为大家介绍一下。 1、CISP 国家注册信息安全专业…

vue3【父子组件间的传值--setup语法糖】

这篇文章主要讲解vue3语法糖中组件传值的用法、 一、父组件给子组件传值 父组件 <template><div classmain>我是父组件<Child :msg"parentMsg"></Child></div></template><script setup> import Child from ./child im…

idea热部署插件JRebel激活

JRebel可以实现在idea中热部署项目&#xff0c;修改后不用重启项目&#xff0c;让开发更丝滑。 JRebel需要激活才可以正常使用。 不想安装服务的可以用我个人部署的服务器注册&#xff0c;不保证稳定哦&#xff0c;有问题可以留言。 安装完插件直接看激活。 http://121.5.183.2…

亲水性Sulfo-Cyanine3 NHS ester水溶性CY3标记活性脂

Sulfo-Cy3是一种荧光染料&#xff0c;可用于生物成像和细胞标记等应用。Sulfo-Cy3是一种含有硫酸基的Cy3染料&#xff0c;具有高度的水溶性和稳定性。Sulfo-Cy3可以与NHS&#xff08;N-羟基琥珀酰亚胺&#xff09;结合&#xff0c;形成Sulfo-Cy3 NHS&#xff0c;这种结合物可以…

微生物常见统计检验方法比较及选择

谷禾健康 微生物组经由二代测序分析得到庞大数据结果&#xff0c;其中包括OTU/ASV表&#xff0c;物种丰度表&#xff0c;alpha多样性、beta多样性指数&#xff0c;代谢功能预测丰度表等&#xff0c;这些数据构成了微生物组的变量&#xff0c;大量数据构成了高纬度数据信息。 针…

[JS与链表]双向链表

前言 阅读本文前请先阅读 [JS与链表]普通链表_AI3D_WebEngineer的博客-CSDN博客 ES6的Class继承 类的继承可以使用extends&#xff0c;让子类继承父类的属性和方法。 而在子类内部&#xff08;构造函数constructor&#xff09;必须调用super()实现继承&#xff08;super()代表父…

基于MPSOC+C6678+高精度AD/DA的软件无线电处理平台

板卡概述 VPX_XM630 是一款基于6U VPX 总线架构的高速信号处理平台&#xff0c;该平台采用一片Xilinx 的Kintex UltraScale 系列FPGA&#xff08;XCKU115&#xff09;作为主处理器&#xff0c;完成复杂的数据采集、回放以及实时信号处理算法。采用一片带有ARM 内核的高性能嵌入…

k8s简单记录

进入pod中的某个容器并执行命令 # 进入pod中的busybox容器&#xff0c;查看文件内容 # 补充一个命令: kubectl exec pod名称 -n 命名空间 -it -c 容器名称 /bin/sh 在容器内部执行命令 # 使用这个命令就可以进入某个容器的内部&#xff0c;然后进行相关操作了 # 比如&#x…

【论文简述】Multi-View Stereo Representation Revisit: Region-Aware MVSNet(CVPR 2023)

一、论文简述 1. 第一作者&#xff1a;Yisu Zhang 2. 发表年份&#xff1a;2023 3. 发表期刊&#xff1a;CVPR 4. 关键词&#xff1a;MVS、3D重建、符号距离场 5. 探索动机&#xff1a;像素深度估计仍存在两个棘手的缺陷。一是无纹理区域的估计置信度较低。二是物体边界附…

一文读懂DNS解析原理和流程(中科三方)

什么是DNS域名解析 我们首先要了解域名和IP地址的区别。IP地址是互联网上计算机唯一的逻辑地址&#xff0c;通过IP地址实现不同计算机之间的相互通信&#xff0c;每台联网计算机都需要通过IP地址来互相联系和分别。 但由于IP地址是由一串容易混淆的数字串构成&#xff0c;人们很…