【vue】- 简易版筛选组件可展开/收起

news2024/11/25 14:34:19

仅做记录,未整理格式
css部分未完全,每个筛选条件为固定宽度

实现效果

单行筛选条件时不触发更多按钮,且做占位处理单行筛选条件
多行筛选条件时默认收起


同时设定最大/最小宽度并监听该组件宽度变化
在这里插入图片描述
在这里插入图片描述

filter.vue组件
<template>
  <div :class="`new-filter-block ${!showMoreFilter?'new-filter-block_hidden':''}`">
    <div id="resize-element" ref="filter" class="new-filter-slotBox" >
      <slot />
      <div v-show="seizeList.length"  v-for="(item, index) in seizeList" :key="index"  class="new-filter-item_seize"/>
    </div>
    <div class="new-filter-btnBox">
      <el-button class="new-second-btn" @click="search" >搜索</el-button>
      <el-button @click="reset" >重置</el-button>
      <div :class="`new-filter-more ${!moreFilter?'new-filter-more_hidden':''}`" @click="handleMoreFilter" >
        {{ showMoreFilter ? '收起' : '更多' }} <i class="el-icon-arrow-down" />
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: 'LFilters',
  emits: ['search', 'reset'],
  props: {
  },
  data() {
    return {
      showMoreFilter: false,
      moreFilter: false,
      observer: null,
      oldWidth: 0,// 记录下旧的数据,避免重复触发回调函数
      seizeList:[],//空白占位数据
      filterCount:0,//筛选条件的个数,保证不受占位符的影响
    }
  },
  mounted() {
    this.filterCount=this.$refs.filter.children.length
    const resizeObserver = new ResizeObserver(entries => {
    // 回调
      const curBoxWidth = entries[0].contentBoxSize[0].inlineSize
      this.handleFilterResize(curBoxWidth)
    })

    // 监听筛选条件盒子
    resizeObserver.observe(this.$refs.filter)
  },
  methods: {
    /**
     * 高级筛选
     */
    handleMoreFilter() {
      this.showMoreFilter = !this.showMoreFilter
    },
    // 触发搜索事件
    search() {
      this.$emit('search')
    },
    reset() {
      this.$emit('reset')
    },
    // 处理筛选条件宽度变化
    handleFilterResize(boxW) {
      if (!boxW || this.oldWidth === boxW) return
      this.oldWidth = boxW
      const itemMinW = 280
      const marginR = 10
      const filterItemW = itemMinW + marginR
      const rowCount = Math.floor(boxW / filterItemW)
      const filterCount = this.filterCount
      this.moreFilter = filterCount > rowCount
      if(this.moreFilter){//设置占位列表长度,最多为rowCount
        let excessiveCount=filterCount%rowCount
        this.seizeList=new Array(rowCount-excessiveCount).fill('')
      }
    }
  }
}
</script>

<style lang="scss" scoped>
@import '@/styles/variables.scss';
::v-deep{
  .el-input__inner,
  .el-date-editor,
  .el-range-separator,
  .el-input__icon {
    height: 32px !important;
    line-height: 32px !important;
  }
  .el-select, .el-cascader, .el-input  {
    width: 100%;
    min-width: 140px;
    .el-input__inner{
      padding-right: 12px !important;
    }
  }
  .el-cascader__tags {
    // display: none;
    .el-tag{
      display: none;
    }
  }
  .el-date-editor {
    width: 100%;
    .el-range-separator {
      width: 16px;
      padding: 0;
    }
  }
}
.new-filter-block{
  padding: 12px;
  background-color: #F8F8F8;
  display: flex;
  // flex-wrap: wrap;
  .new-filter-slotBox{
    flex: 1;
    display: flex;
    flex-wrap: wrap;
    .new-filter-item_seize,
    .new-filter-item{
      flex: 1;
      min-width: 280px;
      max-width: 340px;
      margin-bottom: 10px;
      display: flex;
      flex-wrap: nowrap;
      align-items: center;
      font-size: 14px;
      color: $text-col-3;
      margin-right: 10px;
    }
    .new-filter-itemLabel {
      width: 88px;
      text-align: right;
      margin-right: 12px;
      word-break: keep-all;
    }
  }
  .new-filter-btnBox{
    display: flex;
    font-size: 12px !important;
    .el-button {
      width: 54px;
      height: 32px;
      padding: 0;

    }
    .new-filter-more{
      width: 54px;
      height: 32px;
      line-height: 32px;
      margin-left: 10px;
      color:$blue;
      cursor: pointer;
    }
    .new-filter-more_hidden{
      visibility: hidden;
    }
  }
}
.new-filter-block_hidden{
  height: 56px;
  overflow: hidden;
}

</style>


使用
 <LFilters @search="()=>search()" @reset="()=>emptyQuery()" >
 	//...等宽筛选条件
 </LFilters>

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

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

相关文章

c#调用c++ dll,Release版本内存访问错误

最近遇到个比较经典的案例&#xff0c;在c#中调用yara进行文件检测&#xff0c;yara是c编写的一个非常强大库&#xff0c;github有个大佬用c#对其进行了封装&#xff0c;使其能在跨平台下&#xff0c;只需编译yara的so或dll就能直接跑。但总是在Release版本下时不时就崩溃&…

Hadoop 组成

4 Hadoop 优势(4 高) 1)高可靠性:Hadoop底层维护多个数据副本,所以即使Hadoop某个计算元素或存储出现故障,也不会导致数据的丢失。 2)高扩展性:在集群间分配任务数据,可方便的扩展数以千计的节点。 3)高效性:在MapReduce的思想下,Hadoop是并行工作的,以加快任务…

低代码平台在ERP软件中的作用

很多人认为 低代码开发平台的出现颠覆了传统的软件开发模式&#xff0c;对软件开发行业造成冲击&#xff0c;其实低代码开发平台的出现只是提高了软件开发的效率&#xff0c;并不是要颠覆软件开发的模式。低代码平台在erp软件开发中的作用还是比较明显的。下面一起来了解一下相…

Postman Mock快速入门

目录 前言&#xff1a; 1.Mock简介 1.1 Mock定义 1.2 Mock目的 1.3 Mock意义 1.4 Mock服务 2. Postman 创建Mock服务 2.1 创建Mock服务 2.2 Postman创建Mock服务 2.2.1 Postman 创建Mock服务器参数 2.2.2 Postman创建Mock步骤 3.访问Postman Mock服务 前言&#xf…

css基础知识十三:怎么理解回流跟重绘?什么场景下会触发?

一、是什么 在HTML中&#xff0c;每个元素都可以理解成一个盒子&#xff0c;在浏览器解析过程中&#xff0c;会涉及到回流与重绘&#xff1a; 回流&#xff1a;布局引擎会根据各种样式计算每个盒子在页面上的大小与位置重绘&#xff1a;当计算好盒模型的位置、大小及其他属性…

MySQL-SQL全部锁详解(下)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

老PM,到底在牛什么?

早上好&#xff0c;我是老原。 “成长为一名优秀的项目经理。”相信这是每一个刚入行的项目经理都会立的flag。 对于项目经理来说&#xff0c;这是一个能力和经验并重的岗位&#xff0c;你应该也经常听人说&#xff0c;这项目经理是一个越老越吃香的职业。 就拿我自己来说&a…

【java】HashMap扩容机制详解

文章目录 JDK1.7下的扩容机制JDK1.8下的扩容机制 JDK1.7下的扩容机制 JDK1.7下的resize()方法是这样的&#xff1a; void resize(int newCapacity) { Entry[] oldTable table; int oldCapacity oldTable.length; if (oldCapacity MAXIMUM_CAPACITY) { threshold Integer.…

零样本视频生成无压力,基于飞桨框架实现Text2Video-Zero核心代码及依赖库

项目背景 继 AI 绘画之后&#xff0c;短视频行业正迎来 AI 智能创作的新浪潮。AI 智能创作正在各个方面为创作者和用户带来新的体验和价值。AI 动漫视频、AI 瞬息宇宙、AI 视频风格化等诸多创作功能不仅为视频内容创作提供了全新灵感&#xff0c;而且大大降低了用户创作的门槛…

SpringMVC原理分析 | 数据处理:ModelAndView

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 重定向和转发 ModelAndView 设置ModelAndView对象&#xff0c;根据view的名称、视图解析器跳转到指定的页面 页面&#xff1a;{视图解析器前缀} viewName {视图解析器…

git常用命令之命令集

15. 命令集 场景1. 构造1个文件的10个commit 命令作用for i in {1..10}; do date >> 66.txt && git add . && git commit -sm "update"; done自证 场景2. 构造10个文件 命令作用for i in {1..10}; do date >> "file_$i.log&quo…

Quiz 7: Files | Python for Everybody 配套练习_解题记录

文章目录 课程简介Quiz 7: Files 单选题&#xff08;1-10&#xff09;编程题Exercise 7.2 课程简介 Python for Everybody 零基础程序设计&#xff08;Python 入门&#xff09; This course aims to teach everyone the basics of programming computers using Python. 本课程…

项目——学生信息管理系统1

目录 创建项目 1. 修改Eclipse的编码为UTF-8,具体参考给的文档 1.1 设置代码自动保存 2. 创建Java项目 分包 添加数据库驱动jar包依赖 复制数据库驱动jar包到lib目录下 添加依赖 创建登陆页面 在 org.xingyun.view 包下创建 LoginFrm 选择 WindowBuilder下的 Swing D…

oracle 重复启动监听程序故障

又是一起 oracle 无法连接问题&#xff0c;检查配置都是正常的。 原来是碰到一个oralce的bugl了。 还真就是这个问题&#xff0c;子进程一kill掉&#xff0c;就恢复了。

微服务实战项目-学成在线-课程发布模块

学成在线-课程发布模块 1 模块需求分析 1.1 模块介绍 课程信息编辑完毕即可发布课程&#xff0c;发布课程相当于一个确认操作&#xff0c;课程发布后学习者在网站可以搜索到课程&#xff0c;然后查看课程的详细信息&#xff0c;进一步选课、支付、在线学习。 下边是课程编辑…

视频解说小程序看点小程序搭建上线,流量主对接实现广告收益

什么是视频解说小程序&#xff1f; 影视剪辑和解说&#xff0c;我们都知道有这类的抖音号&#xff0c;这时候就用到我们小程序了&#xff0c;流量主产生了收益。把视频解说上传到小程序&#xff0c;设置为广告观看&#xff0c;这样引导用户去小程序看&#xff0c;就产生一个广告…

(一)等值线 (Spatial Analyst)

等值线 (Spatial Analyst) 1.摘要 根据栅格表面创建等值线(等值线图)的线要素类。 等值线是用于连接各类等值点(如高程、温度、降雨量、污染或大气压力)的线。线的分布显示表面值的变化方式。值的变化量越小,线的间距就越大。值上升或下降得越快,线的间距就越小。 2.…

基于单片机的厨房安全监测

功能介绍 以STM32单片机作为主控系统&#xff1b; OLED液晶显示当前检测的气体浓度&#xff0c;温度&#xff0c;是否有火等信息&#xff1b; 按键可以设置温度上限、可燃气体浓度上限&#xff1b; 当温度超过我们设置自动开启风扇进行降温&#xff1b; 当检测到天然气泄露后蜂…

ROS学习篇之基础知识(一)-环境的安装

文章目录 一.ros的安装1.ros的一键安装&#xff1a;2.ros的验证是否安装成功3.安装导航必备的库&#xff1a; 二.VScode的配置1.安装ros插件2.安装cmake插件 三.VScode的简单使用1.快速注释&#xff1a; 四.pycharm的安装 一.ros的安装 1.ros的一键安装&#xff1a; wget htt…

shiro框架 shiro补充知识MD5加密

01.在用户登录时候&#xff0c;需要输入用户名和密码。 用户名用数据库的select来查询是否存在。 密码比较私密&#xff0c;就是后台的程序员也不可以查看&#xff0c;这需要加密。 一般的加密算法是MD5 02.例如&#xff1a; SecurityUtils 类是shiro框架的一个类。SecurityUt…