如何解决验证v-data-table自定义过滤器问题
我想为我的v-data-table(包含书籍)构建自定义过滤器
- 允许通过输入多个以空格分隔的搜索词来缩小搜索结果的范围
- 将带有连字符的复合词分隔为单独的搜索词
- 所有搜索词都应出现在该项目中,但它们可以出现在不同的列/属性中,因此搜索“ tolkien hobbit”将带给您一本书的标题为“ The Hobbit”和作者“ JRR Tolkien”
我发现在customFilter函数中使用“值”将要求所有搜索词都出现在同一属性中,因此我改用item,但vuetify会将完整的项提供给filter函数,不仅是可过滤的标头数据表中的数据,这会产生不需要的搜索结果,因此我正在重新初始化该项目以消除不需要的道具。
methods: {
customFilter(value,search,item) {
item = {
number: item.number,title: item.title,author: item.author
};
const haystack = Object.values(item).join().toLowerCase();
let s = search.toString().toLowerCase();
let needles = s.replace('-',' ').split(' ');
return needles.filter(needle => haystack.indexOf(needle) >= 0).length == needles.length
}
}
我的问题
- 有没有办法告诉vuetify仅将可过滤的标头道具作为项提供给自定义过滤器?
- 如果没有,是否有比重新初始化更好的方法来摆脱不需要的道具? (使用传播算子进行销毁也可以,但是操作时间更长,并且对于未使用的变量会产生一些烦恼)
- 是否甚至可以通过“价值”而不是“项目”来实现我的要求? (我看不到)
解决方法
回答我自己的问题:
- 不,您不能告诉 vuetify 仅将项目的特定道具传递给自定义过滤器,您只需将项目对象传递
- 我现在通过过滤/减少来摆脱不需要的道具
- value 只给你一个值,大概它默认为第一列,但我不是 100% 确定
我现在的解决方案:
methods: {
itemFilterMultipleSearchTermsAnd(value,search,item) {
const nonSearchableColumns = ["excludedPropName1","excludedPropName2"];
const reducedObject = Object.keys(item)
.filter((key) => !nonSearchableColumns.includes(key))
.reduce((res,key) => ((res[key] = item[key]),res),{});
const haystack = Object.values(reducedObject)
.join()
.toLowerCase();
let s = search.toString().toLowerCase();
let needles = s.replace("-"," ").split(" ");
return (
needles.filter((needle) => haystack.indexOf(needle) >= 0).length ==
needles.length
);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。