pro-components icon indicating copy to clipboard operation
pro-components copied to clipboard

🧐[问题]页面上有个倒计时定时器,打开表格form表单dateRange日期区间选择器

Open jiayapengapp opened this issue 2 weeks ago • 1 comments

提问前先看看:

https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md

🧐 问题描述

页面上有个倒计时定时器,打开表格form表单dateRange日期区间选择器,默认了30天的日期,点击下拉框打开之后不能切换月份,每秒都会切换回当前默认的月份,手动选择一次之后才可已正常选择

💻 示例代码

{ title: '开播日期', dataIndex: 'liveStartDate', align: 'center', valueType: 'dateRange', sorter: true, // 启用排序 search: { transform: (value) => { return { liveStartDate: value[0], liveEndDate: value[1], }; }, }, render: (value, record) => { return <div style={dayjs().format(dateFormat) == dayjs(record.liveStartDate).format(dateFormat) ? { color: 'red' } : {}}> {record.liveStartDate} ({getWeek(record.liveStartDate)}) } },

useEffect(() => { formRef.current.setFieldsValue({ liveStartDate: [dayjs().format(dateFormat), dayjs().add(30, 'day').format(dateFormat)], }) ststusRef.current = ''; getTime(); getList(); return () => { if (timerRef.current) { clearInterval(timerRef.current); } }; }, []); const getList = async (queryParams?: queryParams) => { if (queryParams?.isRefresh) { actionRef?.current?.reload(); } else { actionRef.current?.reloadAndRest(); } setSecond(60); setTimeout(() => { startTimer(); }, 50); }

🚑 其他信息

Image

jiayapengapp avatar Dec 03 '25 09:12 jiayapengapp

Hi @jiayapengapp! I'm Dosu and I’m helping the pro-components team.

你的问题是由于倒计时定时器或 getList 函数反复调用 formRef.current.setFieldsValue,每次都把 dateRange 的值重置为默认的 30 天区间,导致日期选择器面板每秒都跳回默认月份,无法正常切换月份。只有你手动选择一次日期后,值才会真正改变,picker 才不会再被强制重置,可以正常切换月份。

解决方法:只在初始化时设置一次默认日期,不要在定时器或 getList 里反复调用 setFieldsValue。如果需要刷新数据,只刷新表格,不要重置表单的日期区间。推荐用 React 的 state 或 form 的值来管理日期区间,只在用户主动选择或确实需要变更时才更新。

示例代码:

const [dateRange, setDateRange] = useState([dayjs().format(dateFormat), dayjs().add(30, 'day').format(dateFormat)]);

useEffect(() => {
  formRef.current.setFieldsValue({ liveStartDate: dateRange });
  // 只初始化一次,不要在 getList 或定时器里重复设置
}, []);

const handleDateChange = (value) => {
  setDateRange(value);
  formRef.current.setFieldsValue({ liveStartDate: value });
};

// 在 ProTable 的 columns 里
{
  title: '开播日期',
  dataIndex: 'liveStartDate',
  valueType: 'dateRange',
  fieldProps: {
    value: dateRange,
    onChange: handleDateChange,
  },
  // 其他配置...
}

这样 picker 的值只会在初始化和用户选择时更新,不会被定时器反复重置,切换月份就不会卡住了。

相关原理和建议可参考 Ant Design 官方文档pro-components 相关 issue

To reply, just mention @dosu.


How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other

Chat with Dosu Open in Cursor Join Discord Share on X

dosubot[bot] avatar Dec 03 '25 10:12 dosubot[bot]