首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DateTime选择器中的AG-Grid时间戳与数据值不匹配/AG-网格日期时间筛选器

DateTime选择器中的AG-Grid时间戳与数据值不匹配/AG-网格日期时间筛选器
EN

Stack Overflow用户
提问于 2021-07-01 17:03:43
回答 1查看 897关注 0票数 0

堆栈闪电战演示

我在我的一个React项目中使用AG-网格,一个数据表包。此表包含一组DateTime值。为了过滤表中的DateTime值,我使用了一个稍微修改过的AG-Grid文档提供的示例DateTime过滤器版本,它使用了弗拉特皮尔包

我的表中的DateTime值为ISO格式。当我通过日历和时钟进行选择时,筛选器输入中的值与我在日历上选择的值不一样,而且它们与表单元格中的值不匹配。

下面是一个屏幕截图,显示了日历选择和输入之间的区别:

下面是应用过滤器的结果以及它们如何与输入不匹配的屏幕截图:

我被这个问题困扰了很长一段时间,所以如果有人能帮我弄清楚为什么输入、日历和过滤结果中的值不匹配,这将是一个很大的帮助。

堆栈闪电战演示

DataGrid.jsx (AG-网格文档供参考)

代码语言:javascript
运行
复制
import React, { useState } from 'react';
import { AgGridColumn, AgGridReact } from 'ag-grid-react';
import DateTimePicker from './DateTimePicker';
import DATES from './data/DATES.json';
import 'ag-grid-community/dist/styles/ag-grid.css';
import 'ag-grid-community/dist/styles/ag-theme-alpine.css';

const DataGrid = () => {
  const [rowData, setRowData] = useState(DATES);

  const COLUMN_DEFINITION = [
    {
      field: 'dateTime',
      headerName: 'Date Time',
      filter: 'agDateColumnFilter',
      filterParams: {
        defaultOption: 'inRange',
        // Filtering function for DateTime values:
        comparator: function(filterLocalDate, cellValue) {
          filterLocalDate = new Date(filterLocalDate);
          cellValue = new Date(cellValue);
          let filterBy = filterLocalDate.getTime();
          let filterMe = cellValue.getTime();
          if (filterBy === filterMe) {
            return 0;
          }

          if (filterMe < filterBy) {
            return -1;
          }

          if (filterMe > filterBy) {
            return 1;
          }
        }
      }
    }
  ];

  return (
    <div className="ag-theme-alpine" style={{ height: 400, width: 600 }}>
      <AgGridReact
        columnDefs={COLUMN_DEFINITION}
        rowData={rowData}
        defaultColDef={{
          sortable: true,
          filter: true,
          filterParams: {
            buttons: ['apply', 'clear', 'reset', 'cancel']
          }
        }}
        frameworkComponents={{
          agDateInput: DateTimePicker
        }}
      />
    </div>
  );
};

export default DataGrid;

DateTimePicker.jsx (Flatpickr文档可供参考):

代码语言:javascript
运行
复制
import React, {
  useEffect,
  useState,
  useRef,
  forwardRef,
  useImperativeHandle
} from 'react';
import flatpickr from 'flatpickr';
import 'flatpickr/dist/flatpickr.min.css';

export default forwardRef((props, ref) => {
  const [date, setDate] = useState(null);
  const [picker, setPicker] = useState(null);
  const refFlatPickr = useRef();
  const refInput = useRef();

  const onDateChanged = selectedDates => {
    const [selectedDate] = selectedDates;
    setDate(selectedDate);
    props.onDateChanged();
  };

  useEffect(() => {
    setPicker(
      flatpickr(refFlatPickr.current, {
        onChange: onDateChanged,
        dateFormat: 'Z',
        wrap: true,
        enableTime: true,
        enableSeconds: true,
        time_24hr: true
      })
    );
  }, []);

  useEffect(() => {
    if (picker) {
      picker.calendarContainer.classList.add('ag-custom-component-popup');
    }
  }, [picker]);

  useEffect(() => {
    if (picker) {
      picker.setDate(date);
    }
  }, [date, picker]);

  useImperativeHandle(ref, () => ({
    getDate() {
      return date;
    },

    setDate(date) {
      setDate(date);
    },

    setInputPlaceholder(placeholder) {
      if (refInput.current) {
        refInput.current.setAttribute('placeholder', placeholder);
      }
    },

    setInputAriaLabel(label) {
      if (refInput.current) {
        refInput.current.setAttribute('aria-label', label);
      }
    }
  }));

  return (
    <div
      className="ag-input-wrapper custom-date-filter"
      role="presentation"
      ref={refFlatPickr}
    >
      <input type="text" ref={refInput} data-input style={{ width: '100%' }} />
      <a class="input-button" title="clear" data-clear>
        <i class="fa fa-times" />
      </a>
    </div>
  );
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-02 08:46:42

我对您的示例做了两个更改:

  1. 注释掉日期选择器中的属性dateFormat: 'Z'。这会导致选定日期和日期选择器输入框中的日期具有不同的格式。
  2. filterParams.comparator中,我删除了附加在cellValue字符串末尾的'Z‘。在调用new Date(cellValue)时,日期似乎没有给出正确的小时值作为cellValue字符串。因此,为了解决这个问题,我只是删除了'Z'
代码语言:javascript
运行
复制
cellValue = new Date(cellValue.slice(0, -1));

请参见此处实现的:https://stackblitz.com/edit/react-6dwqvh?file=src%2FDataGrid.jsx

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68214272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档