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

如何在Nuxt 3中对useFetch函数进行数据过滤?

在JavaScript层面过滤API数据(替代模板v-if)

我目前通过模板中的v-if实现了仅显示开始日期早于今日的数据,但想换成在JavaScript层面完成过滤,避免加载全部数据。现有代码如下:

当前JS代码

const { data: persons } = await useFetch(urlPersons)
const date = new Date();
const fullYear = date.getFullYear()+"-"+(date.getMonth()+1)+"-0"+date.getDate();

原模板代码

<h1>Testing api</h1>
<div v-for="data in persons" >
    <div>Name :{{data.name}}</div>
    <div>Startdate : {{data.startdate}}</div>
    <div>date today : {{fullYear}}</div>
    <div v-if="data.funfacts.funFact1">{{ data.funfacts.funFact1 }}</div>
</div>

当前用v-if过滤的模板代码

<div v-for="data in persons" >
<div v-if="data.startdate>fullYear">
  <div>Name :{{data.name}}</div>
  <div>Startdate : {{data.startdate}}</div>
  <div>date today : {{fullYear}}</div>
  <div v-if="data.funfacts.funFact1">{{ data.funfacts.funFact1 }}</div>
</div>

两种JavaScript层面的过滤方案

方案1:获取数据后前端过滤

拿到接口返回的persons数据后,直接用数组方法过滤出符合条件的数据,模板循环过滤后的数组即可,不用再写v-if。

修改后的JS代码:

const { data: persons } = await useFetch(urlPersons)
const date = new Date();
// 统一日期格式为YYYY-MM-DD,和接口返回的startdate格式对齐
const today = new Date(date.getFullYear(), date.getMonth(), date.getDate()).toISOString().split('T')[0];

// 用computed响应式处理过滤逻辑
const filteredPersons = computed(() => {
  if (!persons.value) return [];
  return persons.value.filter(person => {
    // 转成Date对象比较,避免字符串格式差异导致的判断错误
    return new Date(person.startdate) < new Date(today);
  });
});

对应的模板代码:

<h1>Testing api</h1>
<div v-for="data in filteredPersons" :key="data.name">
    <div>Name :{{data.name}}</div>
    <div>Startdate : {{data.startdate}}</div>
    <div>date today : {{today}}</div>
    <div v-if="data.funfacts.funFact1">{{ data.funfacts.funFact1 }}</div>
</div>

方案2:请求时让后端过滤(更高效)

如果你的API支持日期参数过滤,直接在请求URL里带上过滤条件,让后端只返回符合要求的数据,能减少前端加载的数据量,性能更优。

比如API支持?startdate_lt=YYYY-MM-DD这类参数,代码可以这么写:

const date = new Date();
const today = new Date(date.getFullYear(), date.getMonth(), date.getDate()).toISOString().split('T')[0];
// 拼接过滤参数到请求URL
const filteredUrl = `${urlPersons}?startdate_lt=${today}`;
const { data: filteredPersons } = await useFetch(filteredUrl);

模板直接循环filteredPersons即可,无需再做前端过滤。

内容的提问来源于stack exchange,提问作者Mathias Van Langendonck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:45:30