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

如何点击MuiDatePicker组件触发open属性以打开日期选择器

解决MuiDatePicker受控模式下点击触发open状态的问题

问题说明

我使用的MuiDatePicker组件无法接收onClick属性。我知晓需要传入一个open(布尔类型)prop来控制弹窗显示,但找不到点击组件(下图标注区域)时触发它的方法。

点击位置示意图

当前代码示例:

const DatePicker: FC<DatePickerProps> = ({ yearsPerRow = 3, ...props }) => {
return (
    <MuiDatePicker
        slotProps={{
            switchViewIcon: { sx: { display: 'none' } },
            openPickerIcon: {
                component: EventIcon,
                style: { fontSize: '16px' },
            },
        }}

        yearsPerRow={yearsPerRow}
        open={boolean} // 这个值需要由组件点击事件控制
        {...props}
    />
);
};

解决方案

要实现点击组件触发open状态切换,需通过受控模式配合useState管理弹窗状态,同时给触发区域添加点击事件:

  • 用useState声明状态变量控制open值
  • 给slotProps里的触发元素(打开图标/输入框)添加点击事件切换状态
  • 监听onClose事件同步关闭状态

修改后的代码:

import { useState } from 'react';
import { MuiDatePicker } from '@mui/x-date-pickers/MuiDatePicker';
import EventIcon from '@mui/icons-material/Event';

const DatePicker: FC<DatePickerProps> = ({ yearsPerRow = 3, ...props }) => {
  // 声明受控状态,管理弹窗的打开/关闭
  const [isOpen, setIsOpen] = useState(false);

  return (
    <MuiDatePicker
      slotProps={{
        switchViewIcon: { sx: { display: 'none' } },
        openPickerIcon: {
          component: EventIcon,
          style: { fontSize: '16px' },
          // 点击图标切换弹窗状态
          onClick: () => setIsOpen(!isOpen),
        },
        textField: {
          // 可选:点击输入框区域也触发弹窗切换
          onClick: () => setIsOpen(!isOpen),
        },
      }}
      yearsPerRow={yearsPerRow}
      open={isOpen}
      // 弹窗关闭时同步更新状态
      onClose={() => setIsOpen(false)}
      {...props}
    />
  );
};

补充说明

  • 如果只需要点击图标触发弹窗,仅保留openPickerIcon内的onClick即可
  • 若需让输入框区域也能触发打开,保留textField的onClick配置
  • 必须配置onClose事件,否则弹窗手动关闭后状态不会同步更新

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 08:42:38