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

Angular中如何通过下拉菜单实现1-3个月范围的日期数据筛选

Angular 下拉选择1/2/3个月范围筛选数据实现

整个实现不需要引入额外第三方库,基于你已有的HTTP Get取数逻辑改造即可。

1. 组件类逻辑编写

核心注意点:单独存储接口返回的全量原始数据,所有筛选操作都基于原始数据计算,避免筛选过程中源数据被污染,导致切换筛选条件时数据异常。
你需要在组件中定义筛选项配置、当前选中的时间范围、接口原始数据、页面展示数据四个核心变量,再补充日期范围计算、数据过滤的方法,参考代码:

import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';

// 替换成你实际业务的数据类型
interface YourBusinessData {
  id: number;
  createTime: string | number; // 替换成你实际业务中存储时间的字段名
  // 其余业务字段...
}

@Component({
  selector: 'app-data-page',
  templateUrl: './data-page.component.html'
})
export class DataPageComponent implements OnInit {
  // 下拉菜单选项配置
  timeFilterOptions = [
    { label: '近1个月', value: 1 },
    { label: '近2个月', value: 2 },
    { label: '近3个月', value: 3 }
  ];
  // 当前选中的筛选月数,默认选中1个月
  selectedMonth: number = 1;
  // 存储接口返回的全量原始数据,筛选过程不修改该数组
  rawDataList: YourBusinessData[] = [];
  // 页面实际渲染的筛选后数据
  showDataList: YourBusinessData[] = [];

  constructor(private http: HttpClient) {}

  ngOnInit() {
    this.fetchDataFromApi();
  }

  // 你现有的HTTP Get取数逻辑
  fetchDataFromApi() {
    this.http.get<YourBusinessData[]>('替换成你的后端接口地址').subscribe(res => {
      this.rawDataList = res;
      // 数据加载完成后默认执行一次筛选,匹配默认选中的时间范围
      this.filterDataByTimeRange();
    })
  }

  // 核心筛选逻辑
  filterDataByTimeRange() {
    // 计算时间范围起点:当前时间往前推选中的月数
    const rangeStartTime = new Date();
    rangeStartTime.setMonth(rangeStartTime.getMonth() - this.selectedMonth);
    const rangeStartTimestamp = rangeStartTime.getTime();

    // 从原始数据中过滤出时间在范围内的条目
    this.showDataList = this.rawDataList.filter(item => {
      const itemTime = new Date(item.createTime).getTime();
      return itemTime >= rangeStartTimestamp;
    })
  }

  // 下拉选项变更时触发筛选
  handleFilterChange() {
    this.filterDataByTimeRange();
  }
}

2. 模板层绑定交互

在组件模板中实现下拉菜单,绑定选中值和变更事件,再遍历渲染筛选后的数据即可,参考代码:

<!-- 筛选栏 -->
<div class="filter-section">
  <span>时间范围:</span>
  <select [(ngModel)]="selectedMonth" (change)="handleFilterChange()">
    <option *ngFor="let option of timeFilterOptions" [value]="option.value">
      {{ option.label }}
    </option>
  </select>
</div>

<!-- 数据展示区域 -->
<div class="data-list">
  <div *ngFor="let dataItem of showDataList" class="data-item">
    <!-- 替换成你实际的业务字段展示 -->
    <p>记录ID:{{ dataItem.id }}</p>
    <p>创建时间:{{ dataItem.createTime | date:'yyyy-MM-dd HH:mm' }}</p>
  </div>
  <div *ngIf="showDataList.length === 0" class="empty-tip">
    当前所选时间范围内无匹配数据
  </div>
</div>

3. 必要配置&开发注意事项

  • 使用ngModel做双向绑定前,必须在当前组件所属的NgModule中导入FormsModule,否则会报模板解析错误,导入代码参考:
import { FormsModule } from '@angular/forms';

@NgModule({
  imports: [
    // 你已有的其他导入项
    FormsModule
  ]
})
export class YourFeatureModule { }
  • 日期比对时统一转成时间戳数值再比较,不要直接对比Date对象,避免不同浏览器对Date解析的差异导致筛选结果不准。
  • 如果你的单页数据量超过1万条,建议把筛选逻辑迁移到后端实现:下拉选完时间范围后,把选中的月数作为请求参数传给接口,由后端返回对应范围的数据,减少前端计算压力;千级以内数据量用前端筛选的方案完全够用。
  • 如果你的业务数据里时间字段名不是createTime,把代码中对应字段名替换成实际字段名即可,只要字段值是可被new Date()正确解析的格式(ISO时间字符串、毫秒级时间戳都支持),不需要额外修改比对逻辑。

内容的提问来源于stack exchange,提问作者Andrelle John Nantes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:45:46