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

React中如何从AG Grid行数据中获取并格式化日期?

AgGridReact处理Timestamp日期导致页面崩溃问题

问题描述

  • 尝试格式化Activity数据数组中的dateTime字段,已确认表格数据非空且能在其他表格库正常展示
  • 活动列表页面崩溃,提示找不到数据中定义的日期,推测是列定义时valueGetter()的数据类型处理错误,找到的文档和教程均为JavaScript版本,无法解决问题

ActivityModel接口定义

export interface ActivityModel extends obj {
  id: string
  key: string
  title: string
  description: string
  dateTime: Timestamp
  duration: number
  notes: string
  type: string
  activity: string
  completed: boolean
  material: string
  size: string
  assignedTo: string
  value: string
  unit: string
  editable: boolean
}

现有Activities页面代码

const [columnDefs] = useState([
        { field: "title", headerName: "Title", filter: "agTextColumnFilter" },
        {
          field: "description",
          headerName: "Description",
          flex: 3,
          filter: "agTextColumnFilter",
        },
        {
          field: "startDate",
          headerName: "Start Date",
          flex: 2,
          filter: "agDateColumnFilter",
          valueGetter: (p: ActivityModel) => {
            return formatDate(p.dateTime.toDate())
          },
        },
        {
          field: "completed",
          headerName: "Completed",
          filter: "agTextColumnFilter",
        },
      ])

    <div className="ag-theme-alpine" style={{ height: 400, width: 1200 }}>
      <AgGridReact
        defaultColDef={defaultColDef}
        rowData={activities}
        columnDefs={columnDefs}
        onGridReady={pullActivities}
      ></AgGridReact>
    </div>

解决方案

1. 修正valueGetter的参数类型

AgGrid的valueGetter接收的是ValueGetterParams类型参数,而非直接的ActivityModel,需要从params.data中获取当前行数据,同时必须做空值判断,避免异步加载时数据未就绪导致的报错:

valueGetter: (params) => {
  // 断言并获取当前行的Activity数据
  const activity = params.data as ActivityModel;
  // 空值保护,避免dateTime不存在时调用toDate()报错
  if (!activity?.dateTime) return '';
  return formatDate(activity.dateTime.toDate());
}

2. 适配agDateColumnFilter的要求

agDateColumnFilter要求过滤值为Date类型或可被解析的标准日期字符串,如果formatDate返回的是非标准格式字符串,会导致过滤器失效或页面异常。建议将valueGetter返回原始Date对象,用valueFormatter专门处理显示格式化:

{
  field: "startDate",
  headerName: "Start Date",
  flex: 2,
  filter: "agDateColumnFilter",
  // 返回Date对象供过滤器使用
  valueGetter: (params) => {
    const activity = params.data as ActivityModel;
    return activity?.dateTime?.toDate() || null;
  },
  // 专门处理前端显示的格式化
  valueFormatter: (params) => {
    return params.value ? formatDate(params.value) : '';
  }
}

3. 异步数据加载的额外处理

由于onGridReady触发pullActivities是异步操作,初始渲染时activities可能为空数组,建议在AgGrid组件上添加空值兜底,避免传递undefined:

<AgGridReact
  defaultColDef={defaultColDef}
  // 空数组兜底,避免传递undefined
  rowData={activities || []}
  columnDefs={columnDefs}
  onGridReady={pullActivities}
></AgGridReact>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:15:33