自定义增减筛选框

项目中遇到自定义筛选内容,需要根据用户自己需求决定筛选条数。在新增筛选条件时对已选数据进行去除处理。

本组件主要关注点已红圈圈定。筛选框打卡默认显示一条,第一条为定筛选条件“当”,如果大于一条后第一条可以删除,第二条将会顺次排为“当”,当删除的数据条数等于1时,删除图标将隐藏。当新增数据条数等于原始选择项条数时,添加将隐藏。

代码中将会有相应注释。视图部分可自行定义,此处粘贴代码主要辅助理解数据处理。

<a-popover v-model:visible="visible" title="筛选条件" trigger="click" placement="rightTop">
        <div class="screenBox"><img style="width: 20px; height: 20px;margin-right: 10px;" src="@/assets/icons/screen.png"/>筛选</div>
        <template #content>
          <!-- 筛选框内容 -->
            <div class="screenContent">
              <div class="screenList">
                <div class="screenListbox" v-for="(item,index) in screenList" :key="index">
                <!-- 序号和当且判断 -->
                  <div class="screenListboxIcon">{{index+1}}</div><span style="padding: 0px 10px;" >{{ index==0?"当":"且" }}</span>
                  <!-- 第一筛选框监听下拉框打开状态,并对数据进行处理 -->
                   <a-select
                      v-model:value="item.screenValue1"
                      style="width: 180px;margin-right: 10px;"
                      :options="item.option"
                      @dropdownVisibleChange="selectChange(index)"
                    >
                    </a-select>
                    <a-select
                      v-model:value="item.screen2"
                      style="width: 190px"
                      :options="option2"
                    >
                    </a-select>
                    <!-- 判断数据条数大于1条时显示删除图标 -->
                  <img v-if="screenList.length>1" style="width: 20px; height: 20px;margin-left: 15px;" src="@/assets/icons/delete.png" @click="deleteList(index)"/>
                </div>
                <!-- 判断数据条数大于原始选择项条数时隐藏新增图标 -->
                <div class="screenListAdd" v-if="screenList.length<option1.length" @click="add">
                  <span>+</span> 添加
                </div>
              </div>
              <div class="screenBottom">
                <div>
                  <a-button @click="resetBox">重置</a-button>
                </div>
                <div>
                  <a-button @click="cancelBox">取消</a-button>
                  <a-button type="primary">确认</a-button>
                </div>
              </div>
            </div>
        </template>
      </a-popover>

原始数据结构及原始选项数据

// 选项原始数据
      option1:
      [
        {label:"项目考勤率",value:"test1"},
        {label:"项目经理考勤率",value:"test2"},
        {label:"总监理工程师考勤率",value:"test3"},
        {label:"工程支付担保金额",value:"test4"},
        {label:"项目经理",value:"test5"},  
        {label:"总监理工程师",value:"test6"}
      ],
      option2:
      [
        {label:"平均考勤率≧80%",value:"test2-1"} ,
        {label:"80%>平均考勤率≧30%",value:"test2-2"} ,
        {label:"平均考勤率<30%",value:"test2-3"} , 
        {label:"未录入或者为0",value:"test2-4"}  ,
        {label:"大于1000万元",value:"test2-5"}  ,
        {label:"未录入",value:"test2-6"}  
      ],
      // 数据数组原始结构
      screenList:[
        {
          screenValue1:'',
          screenValue2:'',
          option: this.option1
        },
      ],

新增数据处理、选择监听时数据处理、删除时数据处理。(删除时仅需要对数据进行对应删除,选择项内容会在数据选择下拉框打开监听时进行处理)

add(){//点击添加新筛选条件
      let optionData = JSON.parse(JSON.stringify(this.option1)) //获取原始选择项
      this.screenList.forEach(item => {//去除现有数据数组中已选选择项
       optionData.forEach((item2,i)=>{
        if(item.screenValue1 == item2.value){
          optionData.splice(i,1)
        }
       })
      });
      this.screenList.push(//添加一条数据
        {
          screenValue1:'',
          screenValue2:'',
          option:optionData//将去除后的选择项赋值给现有选择项
        }
      )
    },
    selectChange(e){//用户如果先添加多条数据,但未选择时应用此逻辑判断处理选择项
      if(this.screenList[e].screenValue1==''){//当选择项为空时触发,将已被选择项去除后赋值
        let optionData = JSON.parse(JSON.stringify(this.option1)) 
        this.screenList.forEach(item => {
        optionData.forEach((item2,i)=>{
          if(item.screenValue1 == item2.value){
            optionData.splice(i,1)
          }
        })
        });
        this.screenList[e].option = optionData
      }else{//当选择项不为空时触发,将已被选择项去除并排除现选择项后赋值
        let optionData = JSON.parse(JSON.stringify(this.option1)) 
        this.screenList.forEach(item => {
        optionData.forEach((item2,i)=>{
          if(item.screenValue1 == item2.value && this.screenList[e].screenValue1!=item2.value){//排除现选择框选项内容
            optionData.splice(i,1)
          }
        })
        });
        this.screenList[e].option = optionData
      }
    },
    deleteList(e){
      this.screenList.splice(e,1)
    },

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值