问题背景
在使用 View UI Plus 的 Table 的时候,在我们使用了表头筛选时,有时候会需要重置筛选条件,将表头的筛选内容全部清空。
官方没有暴露出来清空头部筛选的方法,所以只能我们自己一步步查。
首选已知的是,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 Plus 的 Table 的对于这个 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!完美解决!!