Vuetify:服务器端分页数据表不对客户端进行排序
Vuetify: Server side paginated datatable does not sort client side
问题
问题已经在标题中描述:
当我使用服务器端分页数据表(此组件:https://vuetifyjs.com/en/components/data-tables)并希望它对客户端进行排序(例如,我使用 public API 我没有开发)默认排序不会在组件上工作。
这可能吗?文档仅给出了服务器端分页和排序的示例。
我的组件:
<v-data-table
:headers="datapointHeaders"
:items="datapoints"
:items-per-page="datapointsPerPage"
:server-items-length="datapointsTotalItems"
:loading="loading"
:loading-text="'Loading datapoints ...'"
:options.sync="options"
:footer-props="footerProps"
>
<template v-slot:item.health="{ item }">
<StatusLamp
:color="item.health"
:classes="'ml-2'"
/>
</template>
<template v-slot:item.attributes="{ item }">
<v-btn
outlined
small
color="blue"
@click="showAttributes(item)"
class="mb-1 mr-1 mt-1"
>details</v-btn>
</template>
</v-data-table>
JS部分:
private options: any = {
itemsPerPage: this.datapointsPerPage,
page: this.datapointsCurrentPage,
};
@Watch('options.page')
onPageChange(value: number, oldValue: number): void {
this.fetchDatapoints(value, this.options.itemsPerPage);
}
@Watch('options.itemsPerPage')
onPerPageChange(value: number, oldValue: number): void {
this.fetchDatapoints(this.page, value);
}
get loading(): boolean {
return get(this.$store.getters.getDatapoints, ['loading'], true);
}
get attributes(): any {
const res: any = [];
if (this.selectedDatapoint == null) return [];
Object.keys(get(this.selectedDatapoint, ['attributes'], {})).forEach((key: string) => {
if (Object.prototype.hasOwnProperty.call(get(this.selectedDatapoint, ['attributes'], {}), key)) {
res.push({ name: key, value: this.selectedDatapoint.attributes[key] });
}
});
return res;
}
get datapoints(): any {
return this.$store.getters.getDatapoints.datapoints
? get(this.$store.getters.getDatapoints.datapoints, 'items', []).map((item: any) => ({
...item,
last_value: Math.floor(get(item, ['data', '0', '1'], 0) * 100) / 100,
}))
: [];
}
get datapointsCurrentPage(): number {
return get(this.$store.getters.getDatapoints, ['datapoints', 'meta', 'current_page'], 1);
}
get datapointsPerPage(): number {
return get(this.$store.getters.getDatapoints, ['datapoints', 'meta', 'per_page'], 10);
}
get datapointsTotalPages(): number {
return get(this.$store.getters.getDatapoints, ['datapoints', 'meta', 'total_pages'], 0);
}
get datapointsTotalItems(): number {
return get(this.$store.getters.getDatapoints, ['datapoints', 'meta', 'total_items'], 0);
}
编辑
我刚注意到:只要我从 v-data-table
组件中删除 server-items-length
属性,排序就会工作 client-side。但是,很明显,项目的总长度丢失了,它只显示当前 per_page
作为项目长度的最大值。
经过更多调查
关于 vuetify 官方 discord 上的#vuetify-help 频道,我问的正是这个问题,一旦使用 server-items-length,客户端分页和排序就会被禁用。同样的规则适用于搜索。
此外,经过一些调查,我发现了 search
+ server side pagination
的相关问题:https://github.com/vuetifyjs/vuetify/issues/3475#issuecomment-370566804
结论
我不得不承认,客户端排序和过滤对服务器端分页数据没有任何意义,因为它只会过滤和搜索当前页面。
问题
问题已经在标题中描述: 当我使用服务器端分页数据表(此组件:https://vuetifyjs.com/en/components/data-tables)并希望它对客户端进行排序(例如,我使用 public API 我没有开发)默认排序不会在组件上工作。
这可能吗?文档仅给出了服务器端分页和排序的示例。
我的组件:
<v-data-table
:headers="datapointHeaders"
:items="datapoints"
:items-per-page="datapointsPerPage"
:server-items-length="datapointsTotalItems"
:loading="loading"
:loading-text="'Loading datapoints ...'"
:options.sync="options"
:footer-props="footerProps"
>
<template v-slot:item.health="{ item }">
<StatusLamp
:color="item.health"
:classes="'ml-2'"
/>
</template>
<template v-slot:item.attributes="{ item }">
<v-btn
outlined
small
color="blue"
@click="showAttributes(item)"
class="mb-1 mr-1 mt-1"
>details</v-btn>
</template>
</v-data-table>
JS部分:
private options: any = {
itemsPerPage: this.datapointsPerPage,
page: this.datapointsCurrentPage,
};
@Watch('options.page')
onPageChange(value: number, oldValue: number): void {
this.fetchDatapoints(value, this.options.itemsPerPage);
}
@Watch('options.itemsPerPage')
onPerPageChange(value: number, oldValue: number): void {
this.fetchDatapoints(this.page, value);
}
get loading(): boolean {
return get(this.$store.getters.getDatapoints, ['loading'], true);
}
get attributes(): any {
const res: any = [];
if (this.selectedDatapoint == null) return [];
Object.keys(get(this.selectedDatapoint, ['attributes'], {})).forEach((key: string) => {
if (Object.prototype.hasOwnProperty.call(get(this.selectedDatapoint, ['attributes'], {}), key)) {
res.push({ name: key, value: this.selectedDatapoint.attributes[key] });
}
});
return res;
}
get datapoints(): any {
return this.$store.getters.getDatapoints.datapoints
? get(this.$store.getters.getDatapoints.datapoints, 'items', []).map((item: any) => ({
...item,
last_value: Math.floor(get(item, ['data', '0', '1'], 0) * 100) / 100,
}))
: [];
}
get datapointsCurrentPage(): number {
return get(this.$store.getters.getDatapoints, ['datapoints', 'meta', 'current_page'], 1);
}
get datapointsPerPage(): number {
return get(this.$store.getters.getDatapoints, ['datapoints', 'meta', 'per_page'], 10);
}
get datapointsTotalPages(): number {
return get(this.$store.getters.getDatapoints, ['datapoints', 'meta', 'total_pages'], 0);
}
get datapointsTotalItems(): number {
return get(this.$store.getters.getDatapoints, ['datapoints', 'meta', 'total_items'], 0);
}
编辑
我刚注意到:只要我从 v-data-table
组件中删除 server-items-length
属性,排序就会工作 client-side。但是,很明显,项目的总长度丢失了,它只显示当前 per_page
作为项目长度的最大值。
经过更多调查
关于 vuetify 官方 discord 上的#vuetify-help 频道,我问的正是这个问题,一旦使用 server-items-length,客户端分页和排序就会被禁用。同样的规则适用于搜索。
此外,经过一些调查,我发现了 search
+ server side pagination
的相关问题:https://github.com/vuetifyjs/vuetify/issues/3475#issuecomment-370566804
结论
我不得不承认,客户端排序和过滤对服务器端分页数据没有任何意义,因为它只会过滤和搜索当前页面。