View UI Plus 重置表格表头所有筛选内容(Vue3)

2,011 阅读2分钟

问题背景

在使用 View UI PlusTable 的时候,在我们使用了表头筛选时,有时候会需要重置筛选条件,将表头的筛选内容全部清空。

官方没有暴露出来清空头部筛选的方法,所以只能我们自己一步步查。

首选已知的是,View UI Plus 的 table 暴露出来了一个 filteredValue 的属性,用于头部筛选的默认筛选项。

{
    title: "Address",
    key: "address",
    filters: [
      { label: "London", value: "London" },
      { label: "Sydney", value: "Sydney" },
    ],
    filteredValue: ["London"],
    filterMethod(value, row) {
      return row.address.indexOf(value) > -1;
    }
},

思路一

如果我们记录下需要进行表头筛选的列数组的 index,然后在点击重置时手动改变filteredValue 的值,那么不就可以清空掉所有的筛选内容:

// 假设有表头筛选的 index 数组如下:
const filterIndex = [2, 3];
const columns = ref([ ... ]) // 表格的 columns 数组

// 重置事件
const reset = () => {
  filterIndex.forEach((column) => {
    columns.value[column].filteredValue = [];
    columns.value[column]._isFiltered = false;
  });
};                   

这样,就可以实现表头的筛选内容清空!但是!出现了一个问题:

下拉选项的勾选项清空了,但是勾选按钮的状态没有置灰:

说明这个解决方式不够完美,只能再思考下其他的方式了

思路二

我们现在已经知道勾选的值清空了,只是 icon 的状态没有改变,那么我们来看一下View UI PlusTable 的对于这个 icon 的内部实现:

iview 通过 column 里面的 _isFiltered 属性来控制 icon 的选中 or 取消状态,但是思路1 中我们已经手动改变过这个 _isFiltered 的值了,没有生效,因为在右侧 getColumn 的实现中有说到:

因为表头嵌套不是深拷贝,所以没有 _ 开头的方法,在 isGroup 下用此列

但是这个 isGroup 使用 _id 来查找的,_id 是渲染 dom 的时候的一个随机字符串,我们没有办法做更改。

所以用 _isFiltered 这个属性是不行的。

ok,fine,这个思路没有了,但是有个问题,table 的 filter 是在空间内部给了一个重置的按钮的,那么它内部是怎么实现的呢?

通过查看源码发现:

 handleReset (index) {
   this.$parent.handleFilterReset(index);
 },

它使用了挂载在表格实例上的一个 handleFilterReset方法,入参是 columns 的 index。

good! 既然是挂载在实例上,那我们也可以使用这个方法了!!

小改一下思路一的解决方式:

解决方式

// 假设有表头筛选的 index 数组如下:
const filterIndex = [2, 3];
const columns = ref([ ... ]) // 表格的 columns 数组
                     

const reset = () => {
  filterIndex.forEach((column) => {
    tableRef.value.handleFilterReset(column)
  });
};

ok!完美解决!!