You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vuetify数据表格排序时处理null值:后置或过滤需求

解决Vuetify数据表格averageScore列排序时null值的问题

方案一:让null值始终排在排序结果底部

在表头配置里给averageScore列添加自定义排序逻辑,利用Vuetify的customKeySort属性,根据排序方向调整null值的权重:

修改headers数组中averageScore的配置:

const headers = [
    {
        title: "Name",
        key: "name"
    },
    {
        title: "AverageScore",
        key: "averageScore",
        customKeySort: (a: number | null, b: number | null, isDesc: boolean) => {
            // 处理null值
            if (a === null && b === null) return 0;
            if (a === null) return isDesc ? -1 : 1; // 升序/降序时null都放最后
            if (b === null) return isDesc ? 1 : -1;
            // 正常数值排序
            return isDesc ? b - a : a - b;
        }
    },
];

这样不管是升序还是降序,null值都会被排在所有有数值的条目之后。

方案二:直接过滤掉含null值的条目

如果不需要显示null值的行,可以提前过滤数据,传给表格的是过滤后的数组:

在script里定义计算属性:

const filteredItems = computed(() => {
    return adminStore.polls.filter(item => item.averageScore !== null);
});

然后修改模板中的v-data-table:

<v-data-table
    :items="filteredItems"
    :headers="headers as any"
>
    <!-- 其他模板内容不变 -->
</v-data-table>

这样表格只会显示averageScore不为null的条目,排序时自然不会有null值干扰。

完整修改后的代码示例

Script部分

<script setup lang="ts">
import { computed } from 'vue';

const headers = [
    {
        title: "Name",
        key: "name"
    },
    {
        title: "AverageScore",
        key: "averageScore",
        // 方案一的自定义排序逻辑,不需要可删除
        customKeySort: (a: number | null, b: number | null, isDesc: boolean) => {
            if (a === null && b === null) return 0;
            if (a === null) return isDesc ? -1 : 1;
            if (b === null) return isDesc ? 1 : -1;
            return isDesc ? b - a : a - b;
        }
    },
];

// 方案二的过滤逻辑,不需要可删除
const filteredItems = computed(() => {
    return adminStore.polls.filter(item => item.averageScore !== null);
});

function getColorScore(score: number | null) {
    if (score === null) return "white";
    if (score <= 2) return "red";
    else if (score === 3) return "yellow-darken-3";
    else if (score <= 5) return "green";
}
</script>

Template部分

<template>
    <!-- 用方案二就用filteredItems,否则用adminStore.polls -->
    <v-data-table
        :items="filteredItems"
        :headers="headers as any"
    >
        <template #[`item.averageScore`]="{ value }">
            <v-chip class="px-5" :color="getColorScore(value)">{{ value }}</v-chip>
        </template>
    </v-data-table>
</template>

内容的提问来源于stack exchange,提问作者MerejzCV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 08:07:20