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

如何在react-rainbow DateTimePicker操作按钮点击时调用自定义函数

解决react-rainbow-components DateTimePicker点击确定/取消按钮触发自定义方法的问题

由于react-rainbow-components的DateTimePicker组件没有直接提供确定/取消按钮的回调属性,你可以通过以下两种方案实现需求:

方案一:通过Ref监听弹窗按钮点击

利用React的useRef获取DateTimePicker的DOM元素,监听弹窗内确定、取消按钮的点击事件:

import { DateTimePicker } from "react-rainbow-components";
import { useState, useRef, useEffect } from "react";

export default function App() {
  const [selectedDate, setSelectedDate] = useState(new Date());
  const datePickerRef = useRef(null);

  const handleOkClick = () => {
    console.log("点击了确定按钮");
    // 此处编写自定义逻辑
  };

  const handleCancelClick = () => {
    console.log("点击了取消按钮");
    // 此处编写自定义逻辑
  };

  useEffect(() => {
    const modalElement = datePickerRef.current?.querySelector(".rainbow-modal");
    if (!modalElement) return;

    const handleButtonClick = (e) => {
      const button = e.target.closest("button");
      if (!button) return;

      // 根据按钮文本判断操作,若组件使用中文则改为“确定”“取消”
      if (button.textContent.trim() === "OK") {
        handleOkClick();
      } else if (button.textContent.trim() === "Cancel") {
        handleCancelClick();
      }
    };

    modalElement.addEventListener("click", handleButtonClick);
    return () => {
      modalElement.removeEventListener("click", handleButtonClick);
    };
  }, []);

  return (
    <div className="App">
      <DateTimePicker
        ref={datePickerRef}
        value={selectedDate}
        minDate={new Date(2022, 0, 4)}
        maxDate={new Date()}
        label="DateTimePicker Label"
        onChange={(value) => setSelectedDate(value)}
      />
    </div>
  );
}

注意:如果你的项目对DateTimePicker做了本地化处理(比如按钮显示中文),需要修改判断按钮文本的条件。

方案二:通过状态变化与onBlur区分操作类型

点击确定按钮时,onChange会先触发更新日期状态,随后弹窗关闭触发onBlur;点击取消按钮时,onChange不会触发,仅onBlur触发。通过对比日期状态的变化即可区分两种操作:

import { DateTimePicker } from "react-rainbow-components";
import { useState, useRef } from "react";

export default function App() {
  const [selectedDate, setSelectedDate] = useState(new Date());
  const prevDateRef = useRef(selectedDate);

  const handleOk = () => {
    console.log("点击了确定按钮,新日期:", selectedDate);
    // 此处编写自定义逻辑
  };

  const handleCancel = () => {
    console.log("点击了取消按钮,日期未变更");
    // 此处编写自定义逻辑
  };

  const handleChange = (value) => {
    prevDateRef.current = selectedDate;
    setSelectedDate(value);
  };

  const handleBlur = () => {
    if (selectedDate.getTime() !== prevDateRef.current.getTime()) {
      handleOk();
    } else {
      handleCancel();
    }
  };

  return (
    <div className="App">
      <DateTimePicker
        value={selectedDate}
        minDate={new Date(2022, 0, 4)}
        maxDate={new Date()}
        label="DateTimePicker Label"
        onChange={handleChange}
        onBlur={handleBlur}
      />
    </div>
  );
}

这种方案无需操作DOM,但需要注意:若用户选择日期后直接点击弹窗外部关闭,也会被判定为“取消”操作,这通常符合业务预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 05:55:18