Vuetify 数据表:如何应用标题过滤器功能
Posted
技术标签:
【中文标题】Vuetify 数据表:如何应用标题过滤器功能【英文标题】:Vuetify Data Table: How are header filter functions applied 【发布时间】:2021-01-31 22:28:41 【问题描述】:根据custom filters in v-data-table 的 Vuetify 文档,可以通过在标题项上提供 filter 属性来自定义特定表列的过滤。
在我的应用程序中,我想使用它来自定义单个列的过滤。对于所有其他列,我想保留默认的字符串匹配行为。
作为起点(see codepen),我提供了一个自定义过滤器,它只返回true:
new Vue(
el: '#app',
vuetify: new Vuetify(),
data()
return
headers: [
text: 'Car Manufacturers',
value: 'car',
filter() return true
,
text: 'Country of Origin',
value: 'country'
],
items: [
car: 'Honda', country: 'Japan' ,
car: 'Audi', country: 'Germany' ,
car: 'Ford', country: 'USA'
],
search: ''
,
)
和
<div id="app">
<v-app>
<v-container>
<v-text-field
label="Search"
v-model="search"
>
</v-text-field>
<v-data-table
:headers="headers"
:items="items"
:search="search"
>
</v-data-table>
</v-container>
</v-app>
</div>
我现在已经预料到,列 car 上的过滤器会匹配所有行,因此无论我输入什么搜索字符串,都会显示整个表格。
我观察到,该表仍被过滤,但仅按列 country。
相反,当我将过滤器更改为返回 false 时,会显示一个空表。然后我会预料到,该表仅按列 country 过滤。
如何应用标题过滤器?或者,更准确地说:
对于每一行,如何组合各个列过滤器的结果以产生整行的过滤器结果?
【问题讨论】:
【参考方案1】:经过一番挖掘,我在一个关于 v-data-table 过滤的错误报告中找到了this answer。
我仍然不明白这背后的想法,但显然,自定义列过滤器的处理方式与没有自定义过滤器的列不同:
行匹配,如果 (1) 它们匹配 every() 指定的自定义列过滤器并且 (2) 它们匹配 some() 默认过滤器(即包含搜索字符串) .
Vuetify 中的匹配代码好像是this:
return items.filter(item =>
// Headers with custom filters are evaluated whether or not a search term has been provided.
// We need to match every filter to be included in the results.
const matchesColumnFilters = headersWithCustomFilters.every(filterFn(item, search, defaultFilter))
// Headers without custom filters are only filtered by the `search` property if it is defined.
// We only need a single column to match the search term to be included in the results.
const matchesSearchTerm = !search || headersWithoutCustomFilters.some(filterFn(item, search, customFilter))
return matchesColumnFilters && matchesSearchTerm
)
【讨论】:
以上是关于Vuetify 数据表:如何应用标题过滤器功能的主要内容,如果未能解决你的问题,请参考以下文章
如何在 vuetify 的数据表中使用“自定义过滤器”道具?或如何创建自定义过滤器以按标题过滤?
Vuetify:如何过滤 v-data-table 中的数据?
Vue js:Vuetify 服务器端数据表搜索过滤器不起作用