微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

验证v-data-table自定义过滤器问题

如何解决验证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 举报,一经查实,本站将立刻删除。