vue+element-ui的列表查询条件/筛选条件太多以下拉选择方式动态添加条件(支持全选、反选、清空)

news2024/11/15 20:03:55

1、此功能已集成到TQueryCondition组件中

2、最终效果

在这里插入图片描述

3、具体源码(新增moreChoose.vue)

<template>
  <el-popover
    popper-class="t_query_condition_more"
    :bind="popoverAttrsBind"
    ref="popover"
    v-if="allcheckList.length>0"
  >
    <div class="inside_box">
      <div class="inside_box_title">
        <div>{{popoverAttrsBind.title||'所有条件'}}</div>
        <div class="check-box">
          <el-button
            size="mini"
            type="text"
            @click="handlecheckAll"
          >{{popoverAttrsBind.allTxt||'全选'}}</el-button>
          <el-button
            size="mini"
            type="text"
            @click="handleReset"
          >{{popoverAttrsBind.clearTxt||'清空'}}</el-button>
          <el-button
            size="mini"
            type="text"
            @click="handleReverseCheck"
          >{{popoverAttrsBind.reverseTxt||'反选'}}</el-button>
        </div>
      </div>
      <el-checkbox-group v-model="checkList" class="inside_box_main" @change="getcheck">
        <el-checkbox v-for="item of allcheckList" :key="item.name" :label="item.label"></el-checkbox>
      </el-checkbox-group>
    </div>
    <span class="more_dropdown_icon" slot="reference">
      <span class="out_box">{{popoverAttrsBind.showTxt||'更多'}}</span>
      <i class="el-icon-arrow-down"></i>
    </span>
  </el-popover>
</template>
<script>
export default {
  name: 'MoreChoose',
  props: {
    // 以下拉方式展示更多条件---数据源
    moreCheckList: {
      type: Array,
      default: () => []
    },
    // 更多条件--el-popover属性
    popoverAttrs: {
      type: Object,
      default: () => ({})
    }
  },
  data() {
    return {
      checkList: [],
      isCheckList: [], // 已选中
      allcheckList: this.moreCheckList // 全部可选项
    }
  },
  watch: {
    // 全部可选项
    moreCheckList: {
      handler(list) {
        this.allcheckList = list
      },
      deep: true
    },
    // 选中项
    checkList: {
      handler(nval, oval) {
        let list = []
        oval.forEach(ele => {
          if (!nval.some(val => val == ele)) {
            list.push(ele)
          }
        })
        this.isCheckList.forEach((ele, j) => {
          if (list.filter(val => val == ele.label)[0]) {
            delete this.isCheckList[j]
          }
        })
      }
    }
  },
  computed: {
    // 以下拉方式展示更多条件--属性
    popoverAttrsBind() {
      const popoverAttrs = { showTxt: '更多', title: '所有条件', allTxt: '全选', reverseTxt: '反选', clearTxt: '清空', ...this.popoverAttrs }
      return { placement: 'bottom', width: 240, trigger: 'click', ...popoverAttrs }
    }
  },
  methods: {
    // 全选
    handlecheckAll() {
      this.checkList = this.allcheckList.map((item) => item.label)
      // console.log('全选', this.checkList)
      this.isCheckList = this.allcheckList
      const checkObj = this.analysisObj(this.isCheckList)
      this.$emit('getCheckList', checkObj)
    },
    // 反选
    handleReverseCheck() {
      const checkList = JSON.parse(JSON.stringify(this.checkList))
      this.checkList = []
      this.isCheckList = []
      this.allcheckList.forEach((ele, j) => {
        if (!checkList.filter((item1) => item1 == ele.label)[0]) {
          this.checkList.push(ele.label)
          this.isCheckList.push(ele)
        }
      })
      const checkObj = this.analysisObj(this.isCheckList)
      // console.log('反选', checkObj)
      this.$emit('getCheckList', checkObj)
    },
    // 清空
    handleReset() {
      // console.log('清空')
      this.checkList = []
      this.isCheckList = []
      this.$emit('getCheckList', {})
    },
    // 单选
    getcheck(val) {
      this.allcheckList.forEach((ele, j) => {
        if (val.filter(item1 => item1 == ele.label)[0]) {
          this.isCheckList.push(ele)
        }
      })
      // console.log('isCheckList---', this.isCheckList, this.checkList)
      const checkObj = this.analysisObj(this.isCheckList)
      // console.log('checkObj--222', checkObj)
      this.$emit('getCheckList', checkObj)
    },
    // 格式化
    analysisObj(val) {
      return val.reduce((obj, item) => {
        obj[item.prop] = {
          label: item.label,
          comp: item.comp,
          bind: item.bind,
          child: item && item.child,
          slotName: item && item.slotName,
          span: item && item.span,
          defaultVal: item && item.defaultVal
        }
        if (item.comp === 'el-select') {
          obj[item.prop].child = item.list.reduce((acc, cur) => {
            acc.push({
              comp: 'el-option',
              value: cur[item.valueKey || 'key'],
              bind: {
                label: cur[item.labelKey || 'label'],
                key: cur[item.valueKey || 'key']
              }
            })
            return acc
          }, [])
        }
        return obj
      }, {})
    }
  }
}
</script>
<style lang="scss">
.t_query_condition_more.el-popover {
  padding: 10px 15px;
  padding-top: 5px;
  .inside_box {
    display: flex;
    flex-direction: column;
    .inside_box_title {
      display: flex;
      justify-content: space-between;
      align-items: center;
    }
    .inside_box_main {
      display: grid;
      grid-template-columns: repeat(2, minmax(100px, 50%));
      .el-checkbox {
        display: flex;
        align-items: center;
        .el-checkbox__label {
          -webkit-box-sizing: border-box;
          box-sizing: border-box;
          overflow: hidden;
          text-overflow: ellipsis;
          word-break: break-all;
          min-width: 90px;
        }
      }
    }
  }
}
</style>

4、集成到TQueryCondition组件

在这里插入图片描述

注意点:开启以下拉方式展示更多条件禁用展开&收起功能

代码示例

<template>
  <t-layout-page>
    <t-layout-page-item>
      <t-query-condition
        ref="queryCondition"
        :opts="opts"
        isDropDownSelectMore
        :loading="loading"
        :moreCheckList="moreCheckList"
        @submit="conditionEnter"
        @getCheckList="getChildCheck"
      >
        <template #likeTransportNo="{param}">
          <el-input v-model="param.likeTransportNo" clearable placeholder="自定义插槽输入框" />
        </template>
      </t-query-condition>
    </t-layout-page-item>
  </t-layout-page>
</template>
<script>
const ADDRESS_TYPES = [
  {
    label: '前纺一车间',
    key: 'W1'
  },
  {
    label: '前纺二车间',
    key: 'W2'
  },
  {
    label: '前纺三车间',
    key: 'W3'
  }
]
export default {
  name: 'queryData',
  data() {
    return {
      loading: false,
      queryData: {
        likeCargoNo: null,
        likeBookNo: null,
        likeTransportNo: null,
        likeCargoName: null,
        workshopNum: null,
        workshopNum1: null,
        date1: null,
        // date: null,
      },
      sexList: [],
      hobbyList: [],
      opts: {
        likeCargoNo: {
          label: '货源编号',
          comp: 'el-input'
        },
        likeBookNo: {
          labelRender: () => {
            return (
              <el-tooltip content={'自定义label'} placement="top">
                <div>订单编号</div>
              </el-tooltip>
            )
          },
          placeholder: '自定义label',
          comp: 'el-input'
        },
        likeTransportNo: {
          label: '运单编号',
          comp: 'el-input',
          slotName: 'likeTransportNo',
        },
        likeCargoName: {
          label: '货品名称',
          comp: 'el-input',
          bind: {
          }
        },
        workshopNum1: {
          label: '车间2',
          comp: 'el-select',
          child: ADDRESS_TYPES.reduce((acc, cur) => {
            acc.push({
              comp: 'el-option',
              value: cur.key,
              bind: {
                label: cur.label,
                key: cur.key
              }
            })
            return acc
          }, [])
        },
        workshopNum: {
          label: '车间',
          comp: 'el-select',
          changeEvent: 'change',
          // defaultVal: 'W1',
          bind: {
          },
          child: [
            {
              comp: 'el-option',
              value: 'W1',
              bind: {
                label: '前纺一车间',
                key: 'W1'
              }
            },
            {
              comp: 'el-option',
              value: 'W2',
              bind: {
                label: '前纺二车间',
                key: 'W2'
              }
            },
            {
              comp: 'el-option',
              value: 'W3',
              bind: {
                label: '前纺三车间',
                key: 'W3'
              }
            }
          ]
        },
        date1: {
          label: '日期',
          comp: 'el-date-picker',
          bind: {
            valueFormat: 'yyyy-MM-dd'
          }
        },
      },
      checkQuery: {}
    }
  },
  computed: {
    moreCheckList() {
      return [
        { label: '姓名', comp: 'el-input', prop: 'name' },
        { label: '年龄', comp: 'el-input', prop: 'age' },
        { label: '性别', comp: 'el-select', prop: 'sex', valueKey: "value", list: this.sexList },
        {
          label: "爱好", comp: "t-select", prop: 'hobby', span: 2, bind: { multiple: true, optionSource: this.hobbyList, valueKey: "value", },
        },
        { label: '合同号', comp: 'el-input', prop: 'contractNo' },
        { label: '供应商', comp: 'el-input', prop: 'supplier' },
        { label: '磅单号', comp: 'el-input', prop: 'balanceCode' },
        { label: '车牌号', comp: 'el-input', prop: 'license' },
        { label: '备注', comp: 'el-input', prop: 'remark' },
        { label: '检验员', comp: 'el-input', prop: 'inspector' },
        { label: '取样人', comp: 'el-input', prop: 'sampler' },
        { label: '审核人', comp: 'el-input', prop: 'reviewer' },
        { label: '其他检验项', comp: 'el-input', prop: 'physicsInspection' },
        { label: '实际数量', comp: 'el-input', prop: 'factQuantity' }
      ]
    }
  },
  watch: {
    checkQuery: {
      handler(nval, oval) {
        for (let i = 0; i < Object.keys(oval).length; i++) {
          this.$delete(this.opts, Object.keys(oval)[i])
        }
        this.opts = Object.assign({}, this.opts, nval)
        for (let i = 0; i < Object.keys(this.opts).length; i++) {
          this.queryData[Object.keys(this.opts)[i]] = null
        }
      },
      deep: true
    }
  },
  created() {
    this.getList()
  },
  // 方法
  methods: {
    getList() {
      this.sexList = [{ label: '男', value: '1' }, { label: '女', value: '2' }]
      this.hobbyList = [
        { label: '吉他', value: '0' },
        { label: '看书', value: '1' },
        { label: '美剧', value: '2' },
        { label: '旅游', value: '3' },
        { label: '音乐', value: '4' }
      ]
    },
    getChildCheck(val) {
      this.checkQuery = val
    },
    // 点击查询按钮
    conditionEnter(data) {
      this.loading = true
      this.queryData = data
      console.log('最终条件', this.queryData)
      setTimeout(() => {
        this.loading = false
      }, 2000)
    }
  }
}
</script>

5、以下拉方式展示更多条件–配置参数(Attributes)

参数说明类型默认值
popoverAttrsel-popover配置及中文文案object具体看源码
moreCheckList数据源Array-
-----label标题string-
-----comp组件名称,可直接指定全局注册的组件string,component-
-----prop接收字段(即后台接收字段)string-
-----bind组件配置参数(Attributes)object-
-----slotName自定义输入框插槽string-
-----span控件占用的列宽,默认占用 1 列,最多 4 列 (独占一行)number1
-----defaultVal默认值string-
-----listel-select 组件options 数据Array-

6. 事件(events)

事件名说明回调参数
getCheckList下拉动态添加条件返回选中的条件项

7、demo地址

GitHub源码地址

Gitee源码地址

相关文章

基于ElementUi或Antd再次封装基础组件文档

vue3+ts基于Element-plus再次封装基础组件文档

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

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

相关文章

本地VSCode连接远程linux环境服务器的docker

目录 1、安装远程SSH 2、连接远程主机 3、远程中安装docker 4、查看容器 &#xff08;1&#xff09;直接查看容器和镜像 &#xff08;2&#xff09;使用命令查看 最近在新服务器中执行程序&#xff0c;要用到远程的docker。但是命令行环境下查看代码非常不方便&#xff0…

upload-labs 1-19关 攻略 附带项目下载地址 小白也能看会

本文章提供的工具、教程、学习路线等均为原创或互联网收集&#xff0c;旨在提高网络安全技术水平为目的&#xff0c;只做技术研究&#xff0c;谨遵守国家相关法律法规&#xff0c;请勿用于违法用途&#xff0c;如有侵权请联系小编处理。 环境准备&#xff1a; 1.靶场搭建 下…

Nsight System and Nsight Compute 性能分析工具

Nsight System 系统级别去分析性能&#xff0c;也就是宏观方向。 Achieved Accupacy低&#xff1a;在Nsight System pipline可以直接看出来 kernel launch 延迟&#xff1a;cpu发起gpu执行kernel过程中&#xff0c;有个kernel launch环节&#xff0c;grid block。优化方法&a…

ScrollView(滚动条)

1.滚动到底部&#xff1a; 我们可以直接利用ScrollView给我们提供的:fullScroll()方法&#xff1a; scrollView.fullScroll(ScrollView.FOCUS_DOWN);滚动到底部 scrollView.fullScroll(ScrollView.FOCUS_UP);滚动到顶部 另外用这玩意的时候要小心异步的玩意&#xff0c;就是a…

iOS 18:照片应用添加“恢复”相册,可恢复数据库损坏所丢失照片!

小伙伴们可能在使用 iPhone 拍摄时遇到“明明拍下了&#xff0c;但是相册中却根本没有相关照片”的问题&#xff0c;而在 iOS 18 / macOS 15 中&#xff0c;苹果公司悄悄为“照片”应用引入了一项“恢复”功能以解决相关 Bug。 按照苹果的描述&#xff0c;照片、视频丢失可能是…

XXE漏洞复现

XML外部实体注入(XML Extenrnal Entity Injection)&#xff0c;简称XXE漏洞。引发XXE漏洞的主要原因是XML解析依赖库libxml默认开启了对外部实体的引用&#xff0c;导致服务端在解析用户提交的XML信息时未作处理直接进行解析&#xff0c;导致加载恶意的外部文件和代码&#xff…

一文剖析高可用向量数据库的本质

面对因电力故障、网络问题或人为操作失误等导致的服务中断&#xff0c;数据库系统高可用能够保证系统在这些情况下仍然不间断地提供服务。如果数据库系统不具备高可用性&#xff0c;那么系统就需要承担停机和数据丢失等重大风险&#xff0c;而这些风险极有可能造成用户流失&…

SpringBoot通过3种方式实现AOP切面

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

实战内测-某内测项目站点FUZZ到Sql注入

0x1 前言 下面给师傅们分享的案例呢是前段时间实战的一个站点&#xff0c;也是我朋友前段时间让我测的一个站点。整体的测试流程也还算ok&#xff0c;然后里面有些细节要是对师傅们有帮助可以收藏下&#xff0c;后面主要是利用FUZZ打了一个sql注入漏洞上去。 0x2 fuzz和sql结…

MAC安装acl

在编译前&#xff0c;需要先从 github https://github.com/acl-dev/acl 下载源码&#xff0c;国内用户可以选择从 gitee https://gitee.com/acl-dev/acl 下载源码。 3.1、Linux/Unix 平台上编译安装 在 Linux/Unix 平台上的编译非常简单&#xff0c;可以选择使用 make 方式或 …

【高校科研前沿】马里兰大学地理科学系在环境科学Top期刊发文:美国本土湿地因不透水面而损失的热点区域

1.文章简介 论文名称&#xff1a;Hotspots of wetland loss to impervious surfaces in the conterminous United States&#xff08;美国本土湿地因不透水面而损失的热点区域&#xff09; 第一作者及单位&#xff1a;Zhenhua Zou&#xff08;马里兰大学(美国)|助理研究教授&a…

Widget自定义动画按钮实战(鼠标进入则放大,离开恢复)

目录 引言 准备工作 步骤一&#xff1a;创建项目和基础控件 步骤二&#xff1a;设计UI 步骤三&#xff1a;自定义按钮类&#xff08;AniBtn&#xff09; 步骤四&#xff1a;在主窗口中使用自定义按钮 步骤五&#xff1a;编译和运行 总结 引言 在Qt开发中&#xff0c;自…

226翻转二叉树

解题思路&#xff1a; \qquad 树相关的题&#xff0c;大部分都可以通过递归来解决。因为树结构&#xff08;尤其是二叉树&#xff09;天然地具有递归发展的性质&#xff1a;对于二叉树的每个树节点&#xff0c;都有一个左节点和一个右节点&#xff0c;且能无限重复延伸。 \qqu…

World of Warcraft [retail] 100G download 2024.07.31

正式服 D:\Battle.net\World of Warcraft\_retail_

微信小程序-选中文本时选中checkbox

1.使用labe嵌套住checkbox标签 <label class"label-box"> <checkbox >匿名提交</checkbox> </label>2.使checkbox和label组件在同一行 .label-box{display: flex;align-items: center; }效果图 此时选中文本匿名提交&#xff0c;checkbox…

ft232 win10驱动

ft232 win10驱动 https://ftdichip.com/drivers/d2xx-drivers/

2024年导游资格证考试报名照很严格!

2024年导游资格证考试报名照很严格&#xff01; #导游证考试 #导游证 #导游资格证考试 #导游资格证 #全国导游证考试 #导游证报名

初学者如何快速掌握工程项目管理软件?

国内外主流的10款工程项目管理系统软件对比&#xff1a;PingCode、Worktile、金蝶EAS、用友NC、汉得信息H3 BPM、SAP ERP、Wrike、Zoho Projects、Accelo、Celoxis。 选择合适的工程项目管理系统软件往往令许多项目经理和团队感到头痛。这不仅关系到项目的效率和成功率&#xf…

C++初学(8)

8.1、string类简介 现在可以用string类型的变量而不是字符数组来存储字符串&#xff0c;string类也用的会比数组简单&#xff0c;同时提供了将字符串作为一种数据类型的表示方式。 要使用string类&#xff0c;必须在程序中包含头文件string。string类位于名称空间std中&#…

昇思25天学习打卡营第XX天|GAN图像生成

感觉顺序要调整下&#xff0c;先GAN再DCGAN再Diffusion 生成式对抗网络&#xff08;GAN&#xff09;是一种前沿的无监督学习模型&#xff0c;由Goodfellow在2014年提出。它包含生成器和判别器两个对抗组件&#xff1a;生成器负责创造逼真的假图像&#xff0c;判别器则判断图像…