基于el-form实现自动展开/收起的查询条件组件

news2024/11/25 14:41:09

说明

如果查询条件过多,影响页面的展示效果,网上看了一些实现自动展开/收起的,有根据最小高度控制的,有基于条件的如v-show来控制,下面借助js原生的hidden属性实现要素的显示、隐藏控制。
先一下效果:
在这里插入图片描述

优点

  • 不需要额外的设置,根据想要显示的个数,自动控制【展开/收起】
  • 根据屏幕尺寸,自适应显示
  • 适合基于配置生成的前端自动渲染组件,不用额外的参数配置,还可保持页面的整体布局

缺点

  • 没有增加一行几列的配置,有需要的可以自行实现

一、实现思路

根据最大显示个数,超过设置数量,则触发【展开/收起】,将大于设置数量的元素默认设置为隐藏,点击展开/收起时,再切换对应条件的元素显示、隐藏属性。
可以错助document.querySelectorAll 取到相应的元素,元素属性本身有hidden属性,只要改变hidden的值,就可以实现元素的显示/隐藏。
为了提高获取元素的准确性,用div包一下el-form-item,方便精准获取元素
核心代码:

   // 通过maxShow控制元素显示/折叠
    minShowCtrol() {
      const group = window.document.querySelectorAll(`#searchFilter .el-form-item.el-form-item--${this.size}`)
      const len = group?.length ? group?.length - 1 : 0
      if (this.maxShow < len) {
        group.forEach((item, index) => {
          if (index > this.maxShow - 1 && index < len) {
            item.hidden = !this.fold
          }
        })
        this.collapsiable = true
      } else {
        this.collapsiable = false
      }
    },

通过document.querySelectorAll获取的元素属性如下,有兴趣的可以自已输出一下看看,这里使用hidden属性来切换元素的显示隐藏,由于最后的操作按钮也入在el-form-item里,所以记得排除一下
在这里插入图片描述

二、创建SearchFile组件

关键属性:maxShow,默认值3,超过3个则将元素隐藏,小于3个,则不触发【展开/收起】

<template>
  <Form ref="form" :label-width="labelWidth" :size="size">
    <div id="searchFilter" :gutter="10" style="display: flex; flex-wrap: wrap">
      <slot></slot>
      <FormItem>
        <Button type="primary" @click="handleQuery">查询</Button>
        <Button @click="handleReset">重置</Button>
        <Button v-show="collapsiable" type="text" @click="shiftCollapsiable">
          <span>
            {{ fold ? '收起' : '展开' }}
            <i :class="fold ? 'el-icon-arrow-up' : 'el-icon-arrow-down'"></i>
          </span>
        </Button>
      </FormItem>
    </div>
  </Form>
</template>
<script>
import { Form, FormItem, Button } from 'element-ui'
export default {
  name: 'SearchFilter',
  components: { Form, FormItem, Button },
  props: {
    // 最大展示数,默认3个,超过则隐藏,为0时不限制
    maxShow: {
      type: Number,
      default: 3,
    },
    labelWidth: {
      type: String,
      default: '100px',
    },
    size: {
      type: String,
      default: 'small',
    },
  },
  data() {
    return {
      collapsiable: false,
      fold: false,
    }
  },
  created() {},
  mounted() {
    // 通过最大显示个数控制展开/折叠
    if (this.maxShow > 0) {
      this.minShowCtrol()
    }
  },
  methods: {
    shiftCollapsiable() {
      this.fold = !this.fold
      this.minShowCtrol()   
    },
    // 通过maxShow控制元素显示/折叠
    minShowCtrol() {
      const group = window.document.querySelectorAll(`#searchFilter .el-form-item.el-form-item--${this.size}`)
      const len = group?.length ? group?.length - 1 : 0
      if (this.maxShow < len) {
        group.forEach((item, index) => {
          if (index > this.maxShow - 1 && index < len) {
            item.hidden = !this.fold
          }
        })
        this.collapsiable = true
      } else {
        this.collapsiable = false
      }
    },
    handleQuery() {
      this.$emit('search')
    },
    handleReset() {
      this.$emit('reset')
    },
  },
}
</script>
<style lang="scss" scoped></style>

组件属性 Props

参数说明类型可选项默认值
maxShow最大展示个数Number3
labelWidth标签宽度String100px
size组件的尺寸Stringmedium / small / minismall

事件 Events

事件名说明
search触发查询操作,需要自定义实现
reset触发重置操作,需要自定义实现

插槽 Slots

插槽名说明
default默认插槽,定义表单项

三、使用组件

这里不多说,直接把组件引入使用就可以

<template>
  <div>
    <SearchFilter size="mini" :maxShow="3" @search="search" @reset="reset">
      <el-form-item label="收款人信息">
        <el-input v-model="searchData.info" placeholder="账号/开户名"></el-input>
      </el-form-item>
      <el-form-item label="单号1">
        <el-input v-model="searchData.itemNo1"></el-input>
      </el-form-item>
      <el-form-item label="单号2">
        <el-input v-model="searchData.itemNo2"></el-input>
      </el-form-item>
      <el-form-item label="单号3">
        <el-input v-model="searchData.itemNo3"></el-input>
      </el-form-item>
      <el-form-item label="申请日期" prop="date">
        <el-date-picker v-model="searchData.date" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" value-format="yyyy-MM-dd" style="width: auto"> </el-date-picker>
      </el-form-item>
    </SearchFilter>
  </div>
</template>
<script>
import SearchFilter from './SearchFilter'
  export default {
    components: {SearchFilter},
    data() {
      return {
        searchData: {},
      }
    },
    methods: {
      search() {},
      reset() {
        this.searchData = {}
      },
    },
  }
</script>

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

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

相关文章

web扫码登录

文章目录需求流程交互流程服务交互流程关键思路代码生成二维码&#xff0c;返回给PC展示轮询查询二维码状态APP扫码请求登录总结需求 pc端实现app扫码登录 流程 交互流程 服务交互流程 关键思路 主要问题在于如何识别APP端用户&#xff0c;然后传递给PC端已经登录成功 通过…

小程序瀑布流实现

什么是瀑布流布局 瀑布流布局&#xff0c;一般等宽&#xff0c;不等高的列表排列 原理是找出高度之和最小的那一列&#xff0c;在高度最小列继续添加元素 可以通过 absolute 定位实现&#xff0c;动态计算每一项的 top 和 left 封装瀑布流方法 function getAllRect(context…

HTML期末作业课程设计期末大作业--小米网站开发者平台首页 1页

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 公司官网网站 | 企业官网 | 酒店官网 | 等网站的设计与制| HTML期末大学生网页设计作业&#xff0c;Web大学生网页 HTML&#xff1a;结构 CSS&#x…

MyBatis学习笔记(2022-11-30)

熬过无人问津的日子才会有诗和远方。 文章目录一、MyBatis简述二、快速入门三、MyBatis配置文件详解1. MyBatis核心配置文件1.1 configuration&#xff08;配置&#xff09;1.2 properties&#xff08;属性&#xff09;1.3 environments&#xff08;环境配置&#xff09;1.4 ty…

vue项目 element UI input框扫码枪扫描过快 出现数据丢失问题(已解决二)

项目需求: 输入框要掉两个接口&#xff0c;根据第一个验证接口返回的code&#xff0c;弹不同的框&#xff0c;点击弹框确认再掉第二个接口 根据客户现场反应&#xff0c;扫描枪快速扫描会出现 料号前几位字符丢失 不完整的问题。于是开始了测试之路。 解决方案探索 1.首先考…

数据可视化,销量第一的新能源汽车是什么?比亚迪新能源汽车销量接近60万辆

去年以来&#xff0c;新能源汽车火热度席卷全球&#xff0c;中国的新能源汽车无论制造或者销售&#xff0c;数量增长迅猛。下面小编用一款数据可视化软件&#xff0c;带你用可视化数据解读高端制造背后&#xff0c;中国新能源汽车的具体销售情况。同样如果你工作上有数据报表需…

[附源码]计算机毕业设计springboot酒店物联网平台系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

全国省市县 经纬度的 json数据(提供原文件),写Java代码,入库(提供代码)

目录 1 需求2 分析1 需求 有一个全国省市县 经纬度的 json数据,我想要使用代码入库 如何操作,代码咋写 2 分析 首先分析json结构, 一般拿到一个json数据,如果最外层不是 { } 包裹的,那么自己手动加一个 以上这个是自己加的,这个就是key 值就是list 集合 分析完json数…

【并发】深入理解Java线程的底层原理

线程基础知识 线程与进程 进程 操作系统会以进程为单位&#xff0c;分配系统资源&#xff08;CPU时间片、内存等资源&#xff09;&#xff0c;进程是资源分配的最小单位。 当一个程序被运行&#xff0c;从磁盘加载这个程序的代码至内存&#xff0c;这时就开启了一个进程。 线…

LDcad零件新增与导入

LDcad大颗粒小颗粒套装导入方法&#xff0c;以后LDcad也可以用套装搭建模型了。 LDcad大颗粒小颗粒套装导入方法&#xff0c; 以后LDcad也可以用套装搭建模型了。 有个遗憾&#xff0c;就是零件不全。 具体导入方法看下文。 我们可以看到。这些套装都有对应的图标。方便…

环境温湿度在线监测如何实现?有何应用场景?

温度、湿度等环境数据与人们生活生产息息相关。温湿度传感器作为能将温度量和湿度量转换成容易被测量处理的电信号的设备或装置&#xff0c;广泛应用于工农业生产、气象、环保、国防、科研等经常需要对环境或设备的温度与湿度进行测量的领域&#xff0c;因此也产生了对温湿度远…

ASP.NET Core 3.1系列(15)——Entity Framework Core之DB First

1、前言 本文开始介绍一些关于Entity Framework Core的内容。在EFCore中&#xff0c;常用的为DB First模式和Code First模式&#xff0c;下面就来介绍一下如何在EFCore中使用DB First模式生成实体类和数据库上下文。 2、创建测试数据库 在SQL Server中新建一个数据库Dao&…

2016-04《信息资源管理 02378》真卷解析,逐题解析+背诵技巧

本系列博客合计 21 篇&#xff0c;每篇都将解析一张《信息资源管理》真卷&#xff0c;并附带答案解析与背诵技巧。 全国 2016 年 4 月自学考试信息资源管理试题&#xff08;02378&#xff09; 单选题 1、按信息表现形式划分&#xff0c;信息可分为&#xff08;C&#xff09; …

JavaScript的Web api接口

JavaScript的Web api 文章目录JavaScript的Web api选中元素事件操作元素获取/元素内容获取/修改元素属性获取/修改表单元素属性实现一个显示/隐藏 密码的功能实现一个加减计算器复选框全选/全不选获取/修改样式属性点击文字放大字体实现白天模式与夜间模式的切换操作节点新增节…

【附源码】计算机毕业设计JAVA住房公积金筹集子系统的网站系统

【附源码】计算机毕业设计JAVA住房公积金筹集子系统的网站系统 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xf…

3D漫游:所见即所得的形式,构建线上数字展厅

企业在数字化转型的大环境下&#xff0c;较为常用的当属数字展厅了&#xff0c;数字展厅能够为企业、行业协会、展销基地以及体验中心助力&#xff0c;以所见即所得的形式构建线上数字空间&#xff0c;满足企业的数字化展示和数字化营销。3D漫游&#xff0c;更加沉浸式的三维空…

使用 Hibernate Envers 进行实体审计

业务应用程序中的常见要求是在特定数据更改时存储版本控制信息;当某事发生变化时&#xff0c;谁改变了它&#xff0c;改变了什么。在这篇博文中&#xff0c;我们将介绍Hibernate Envers&#xff0c;它是Hibernate JPA库的一个组件&#xff0c;它为实体类提供了一个简单的审计/版…

【Linux网络配置实战】服务器Network静态路由配置

【Linux网络配置实战】服务器Network静态路由配置一、环境介绍1.环境规划2.实验目的二、检查各节点IP地址1.检查server01服务器上2.检查server02服务器网卡3.检查route01上的网卡三、在route01上启动IP包转发四、查看当前两节点互通情况1.查看server01和server02连通状态2.查看…

新手小白可以做什么互联网项目,副业项目应该怎么选择

现在网上的信息这么冗杂&#xff0c;有没有可靠的副业项目呢&#xff1f;怎样才能找到适合自己的副业呢&#xff1f; 说实话&#xff0c;在网上找副业并不难&#xff0c;搜索一下就会出来很多&#xff0c;但新手小白不知道如何选择&#xff0c;导致焦虑&#xff0c;一个重要的…

helm2.0安装及部署

一、helm简介 Helm是Deis (https://deis.com/) 开发的一个用于kubernetes的包管理器。每个包称为一个Chart&#xff0c;一个Chart是一个目录&#xff08;一般情况下会将目录进行打包压缩&#xff0c;形成name-version.tgz格式的单一文件&#xff0c;方便传输和存储&#xff09…