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

Antd TimePicker 如何取消选中后自动滚动至选中项的行为

Antd v4.8.4 TimePicker 保持面板滚动位置解决方案

核心问题在于:TimePicker选中时间后,组件会自动将面板滚动到选中项顶部,你在onSelect里直接调用的scrollTo操作会被组件后续的滚动逻辑覆盖,因为组件内置的滚动执行时机更晚。下面是两个可行的解决思路:

方法一:延迟恢复滚动位置

利用setTimeout把滚动调整操作放到组件自带滚动逻辑之后执行,同时提前记录面板的滚动位置:

  1. 监听面板滚动事件,实时记录当前滚动距离到状态中
  2. 在onSelect回调里,用setTimeout延迟恢复之前记录的滚动位置

代码示例:

import React, { useState, useEffect, useRef } from 'react';
import { TimePicker } from 'antd';

const StickyScrollTimePicker = () => {
  const [lastScrollTop, setLastScrollTop] = useState(0);
  const panelScrollRef = useRef(null);

  // 监听面板滚动,记录滚动位置
  useEffect(() => {
    const panelContent = document.querySelector('.ant-time-picker-panel-content');
    if (!panelContent) return;
    
    panelScrollRef.current = panelContent;
    const handleScroll = () => setLastScrollTop(panelContent.scrollTop);
    
    panelContent.addEventListener('scroll', handleScroll);
    return () => panelContent.removeEventListener('scroll', handleScroll);
  }, []);

  const handleTimeSelect = () => {
    if (!panelScrollRef.current) return;
    // 延迟执行,确保在组件自带滚动之后恢复位置
    setTimeout(() => {
      panelScrollRef.current.scrollTop = lastScrollTop;
    }, 0);
  };

  return <TimePicker onSelect={handleTimeSelect} />;
};

export default StickyScrollTimePicker;

方法二:覆盖组件内部滚动逻辑(进阶)

如果不想依赖setTimeout,可以尝试修改Antd TimePicker的内部组件行为,但需要借助rc-time-picker(Antd TimePicker的底层依赖)的自定义面板能力。不过v4版本的Antd对内部组件暴露有限,这个方法复杂度较高,更推荐第一种方案。

关键注意点

  • Antd v4.8.4的时间面板滚动容器类名是ant-time-picker-panel-content,若后续版本类名变更需同步调整
  • setTimeout(..., 0)的作用是将滚动操作放到事件队列末尾,确保组件自带的滚动逻辑执行完成后,再恢复我们需要的滚动位置

内容的提问来源于stack exchange,提问作者jg-brit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 22:25:12