VUE框架之el-table多个字段联动过滤筛选---前端实现

 
多字段的筛选原理:


< el-table ref = "multipleTable" : data = "pageData"
@ filter-change = "tableFilter" " >
< el-table-column type = "selection" />
< el-table-column prop = "tenantryname" />
< el-table-column prop = "roomArea" />
< el-table-column prop = "satgetime" />
< el-table-column prop = "recetime" />
< el-table-column prop = "total" />
< el-table-column prop = "costtypeShow"
: filters = "this.receivablesstatusList" column-key = "costtype" >
</ el-table-column >
< el-table-column prop = "invoicetypeShow"
: filters = "this.invoicetypestatusList" column-key = "invoicetype"
        filter-placement = "bottom-end" >
</ el-table-column >
< el-table-column prop = "applystatusShow"
: filters = "this.applystatusList" column-key = "applystatus"
        filter-placement = "bottom-end" >
</ el-table-column >
< el-table-column prop = "invoiceShow" label = ""
: filters = "this.billstatusList" column-key = "invoice" width = "100" >
< template slot-scope = "scope" >
< el-tag close-transition > {{scope.row.invoiceShow}} </ el-tag >
</ template >
</ el-table-column >
< el-table-column prop = "clearstateShow" label = ""
: filters = "this.coststatusList" column-key = "clearstate" width = "150" >
</ el-table-column >
< el-table-column prop = "remark" label = "" width = "200" />
</ el-table >
 
 //解释:this.applystatusList ,this.applystatusList ,this.billstatusList,this.coststatusList 是保存筛选条件数组
 

//调用过滤方法
     tableFilter(filters) {
        let isFalg = false;
//用于保存筛选结果数组
        this.resultDatarray = [];
        let key;
//查找所有的过滤条件数组,找到他的key(就是对应的过滤字段)
        for (var index in filters) {
          key = index;
        }
//以key命名,保存为本地数据---this.xxxx数组
 this[key] = filters[key];
        /-----按照第一个过滤条件筛选--------
//数据源:this.receivableList;

        if (this.costtype.length > 0) {
//用于判断是否进入筛选
          isFalg = true;
          for (let i1 in this.costtype) {
            for (let j1 in this.receivableList) {
//---------查询对应的字段,符合条件的存放到 结果临时结果集 this.resultDatarray
              if (this.receivableList[j1].costtype == this.costtype[i1]) {
                this.resultDatarray.push(this.receivableList[j1]);
              }
            }
          }
          if (this.resultDatarray.length == 0) {
筛选了,但没有结果,不用继续下一个筛选条件
            return;
          }
        }
 
------第二个筛选条件----------------
        if (this.invoicetype.length > 0) {
//用于判断是否进入筛选
          isFalg = true;
          let temp = [];
//如果第一个筛选条件执行了,并且有筛选结果,则从筛选结果进行第二个筛选条件
          if (this.resultDatarray.length > 0) {
            for (let i2 in this.resultDatarray) {
              for (let j2 in this.invoicetype) {
                if (this.resultDatarray[i2].invoicetype == this.invoicetype[j2]) {
                  temp.push(this.resultDatarray[i2]);
                }
              }
            }
        //把筛选结果赋值给结果
            this.resultDatarray = temp;
//如果没有第一个筛选条件,则从数据源进行第二个筛选条件
          } else {
            for (let i2 in this.receivableList) {
              for (let j2 in this.invoicetype) {
                if (this.receivableList[i2].invoicetype == this.invoicetype[j2]) {
                  this.resultDatarray.push(this.receivableList[i2]);
                }
              }
            }
          }
          if (this.resultDatarray.length == 0) {
            return;
          }
        }
        ----------------------
        if (this.applystatus.length > 0) {
          isFalg = true;
          let temp = [];
          if (this.resultDatarray.length > 0) {
            for (let i3 in this.resultDatarray) {
              for (let j3 in this.applystatus) {
                if (this.resultDatarray[i3].applystatus == this.applystatus[j3]) {
                    temp.push(this.resultDatarray[i3]);
                }
              }
            }
            this.resultDatarray = temp;
          } else {
            for (let i3 in this.receivableList) {
              for (let j3 in this.applystatus) {
                if (this.receivableList[i3].applystatus == this.applystatus[j3]) {
                  this.resultDatarray.push(this.receivableList[i3]);
                }
              }
            }
          }
          if (this.resultDatarray.length == 0) {
            return;
          }
        }
        ----------------------
        if (this.invoice.length > 0) {
          isFalg = true;
          let temp = [];
          if (this.resultDatarray.length > 0) {
            for (let i4 in this.resultDatarray) {
              for (let j4 in this.invoice) {
                if (this.resultDatarray[i4].invoice == this.invoice[j4]) {
                    temp.push(this.resultDatarray[i4]);
                }
              }
            }
            this.resultDatarray = temp;
          } else {
            for (let i4 in this.receivableList) {
              for (let j4 in this.invoice) {
                if (this.receivableList[i4].invoice == this.invoice[j4]) {
                  this.resultDatarray.push(this.receivableList[i4]);
                }
              }
            }
          }
          if (this.resultDatarray.length == 0) {
            return;
          }
        }
        ----------------------
        if (this.clearstate.length > 0) {
          isFalg = true;
          let temp = [];
          if (this.resultDatarray.length > 0) {
            for (let i5 in this.resultDatarray) {
              for (let j5 in this.clearstate) {
                if (this.resultDatarray[i5].clearstate == this.clearstate[j5]) {
                    temp.push(this.resultDatarray[i5]);
                }
              }
            }
            this.resultDatarray = temp;
          } else {
            for (let i5 in this.receivableList) {
              for (let j5 in this.clearstate) {
                if (this.receivableList[i5].clearstate == this.clearstate[j5]) {
                  this.resultDatarray.push(this.receivableList[i5]);
                }
              }
            }
          }
          if (this.resultDatarray.length == 0) {
            return;
          }
        }
        //如果有筛选结果,则把结果集作为参数给下一个方法
        if (isFalg) {
          this.getSplicPageList(this.resultDatarray);
        } else {
        //如果没有筛选条件,则把数据源作为参数给下一个方法
          this.getSplicPageList(this.receivableList);
        }
      },

### 实现 `el-table` 组件中父子表之间选中状态联动 为了实现在 `Element UI` 的 `el-table` 中嵌套表格的父行与子行选择联动功能,可以采用监听复选框变化的方法来同步更新其他关联项的状态。具体来说,在处理多层嵌套结构时,通过遍历数据集并设置相应的属性以反映当前的选择情况。 对于每一级的数据对象,除了默认存在的字段外还需要额外增加两个布尔类型的标志位用于追踪该条目及其后代是否已被标记为选定: - `isIndeterminate`: 表明此节点处于半选状态; - `checked`: 记录本节点以及所有子孙节点的整体选中状况。 每当检测到某一行被用户手动勾选或取消勾选时,则触发事件处理器函数 `handleSelectionChange()` 来调整这些辅助变量,并据此刷新视图显示[^2]。 下面是一个简单的 Vue.js 方法片段展示了如何实现上述逻辑: ```javascript methods: { toggleRowSelection(rows, selected) { rows.forEach(row => { this.$refs.multipleTable.toggleRowSelection(row, selected); // 如果存在children则递归调用自身完成整棵树的操作 if (row.children && row.children.length > 0) { this.toggleRowSelection(row.children, selected); } }); // 更新根级别checkbox状态 this.updateParentCheckboxState(); }, updateParentCheckboxState() { const allChecked = this.tableData.every(item => !item.children || item.children.every(childItem => childItem.checked) ); const hasUnchecked = this.tableData.some(item => item.children && item.children.some(childItem => !childItem.checked) ); this.tableData.forEach((item) => { item.isIndeterminate = false; if (!allChecked && hasUnchecked) { item.isIndeterminate = true; } else { item.checked = allChecked; } }); this.$forceUpdate(); // 强制重绘界面 }, handleSelectionChange(selection) { selection.forEach(selectedItem => { selectedItem.checked = true; if (selectedItem.children && selectedItem.children.length > 0) { this.toggleRowSelection(selectedItem.children, true); } this.updateParentCheckboxState(); }); } } ``` 在此基础上,还需确保 HTML 模板部分正确配置了 `el-table-column` 和 `el-checkbox` 组件以便能够响应用户的交互行为[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值