请教一下react+antd日期选择器禁用问题 ??

作者站长头像
站长
· 阅读数 18

功能需求就是时间跨度最大为一个月 并且当天以后的禁用 就这个时间跨度最大一个月 试了好多种办法都行 有没有大佬帮我看看代码哪里出了问题 都贴上来了react版本 17.0.2请教一下react+antd日期选择器禁用问题 ??

import { useEffect, useState, useRef } from "react";
import { Modal, Form, DatePicker, message } from "antd";
import moment from "moment"; // 日期转换器
import "./taskModule.less";
// 解构出需要的值避免eslient警告
const PlatModule = ({ isModalVisible, columns, cbState }) => {
  // form操作
  const [form] = Form.useForm();
  const { RangePicker } = DatePicker;
  useEffect(() => {
    if (isModalVisible) {
      form.resetFields();
      setNumRanges(1);
    }
  }, [isModalVisible, columns, form, cbState]);
  // 确认
  const handleOk = () => {
    form
      .validateFields()
      .then(async (values) => {
        cbState(false);
      })
      .catch((error) => {
        message.error("请填完所需选项");
      });
  };

  //   时间的相关
  const [dates, setDates] = useState(null);
  const [values, setValues] = useState([[], [], []]);
  const [numRanges, setNumRanges] = useState(0);
  const [time, setTime] = useState([{ start_date: null, end_date: null }]);
  const rangePickerRef = useRef(null);
  const setValue = (index, val) => {
    if (val) {
      setTime((prevTime) => {
        const newTime = [...prevTime];
        newTime[index] = {
          start_date: moment(val[0]._d).format("YYYY-MM-DD"),
          end_date: moment(val[1]._d).format("YYYY-MM-DD"),
        };
        return newTime;
      });
    }
    const newValues = [...values];
    newValues[index] = val;
    setValues(newValues);
  };
  const handleAdd = () => {
    if (numRanges < 3) {
      setNumRanges(numRanges + 1);
    }
  };
  const disabledDate = (current) => {
    if (current && current > moment().endOf("day")) {
      return true;
    }
    if (!dates) {
      return false;
    }
    const tooLate = dates[0] && current.diff(dates[0], "days") >= 30;
    const tooEarly = dates[1] && dates[1].diff(current, "days") >= 30;
    if (tooEarly || tooLate) {
      return true;
    }
    const startDate = moment(time[0].start_date);
    const diff = current.diff(startDate, "days");
    return diff > 30;
  };
  const onOpenChange = (open) => {
    if (open) {
      setDates([null, null]);
    } else {
      setDates(null);
    }
  };
  const layout = {
    labelCol: { span: 9 },
    wrapperCol: { span: 15 },
  };
  return (
    <Modal
      forceRender // 解决Instance created by `useForm` is not connected to any Form element. Forget to pass `form` prop? 报错
      width={1000}
      visible={isModalVisible}
      title="选择"
      onOk={handleOk}
    >
      <Form
        form={form}
        {...layout}
        name="task-form"
        style={{ marginLeft: "-350px" }}
        validateTrigger="onBlur"
      >
        <Form.Item label={<div className="fomart">选择时间范围</div>}>
          <div className="timeFlex">
            {[...Array(numRanges)].map((_, i) => (
              <RangePicker
                key={`${i}_range`}
                name={`template_time_${i}`}
                value={values[i]}
                disabledDate={disabledDate}
                onChange={(val) => {
                  setValue(i, val);
                }}
                onOpenChange={onOpenChange}
                changeOnBlur
                ref={rangePickerRef}
              />
            ))}
            {+numRanges < 3 && (
              <div className="time_item" onClick={handleAdd}>
                + 添加时间范围
              </div>
            )}
          </div>
        </Form.Item>
      </Form>
    </Modal>
  );
};
export default PlatModule;
回复
1个回答
avatar
test
2024-07-02

1.

const disabledDate = (current) => {
  // 禁用今天以后的日期
  if (current && current > moment().endOf("day")) {
    return true;
  }

  // 如果用户还没有选择日期,那所有的日期都可以选
  if (!dates || dates.length < 2) {
    return false;
  }

  // 计算用户选择的日期范围
  const startDate = dates[0];
  const endDate = dates[1];

  // 如果用户选择的日期范围超过一个月,那这个日期不可以选的
  if (endDate.diff(startDate, 'days') > 30) {
    return true;
  }

  // 其他情况下,这个日期是可选的
  return false;
};

const onDateChange = (dates) => {
  // 当用户选择日期范围时,更新dates变量
  setDates(dates);
};

<RangePicker
  disabledDate={disabledDate}
  onChange={onDateChange}
/>

2.:

const disabledDate = (current, index) => {
  if (current && current > moment().endOf("day")) {
    return true;
  }
  if (!dates) {
    return false;
  }
  const tooLate = dates[0] && current.diff(dates[0], "days") >= 30;
  const tooEarly = dates[1] && dates[1].diff(current, "days") >= 30;
  if (tooEarly || tooLate) {
    return true;
  }
  const startDate = moment(time[index].start_date);
  const diff = current.diff(startDate, "days");
  return diff > 30;
};

const setValue = (index, val) => {
  if (val) {
    setTime((prevTime) => {
      const newTime = [...prevTime];
      newTime[index] = {
        start_date: moment(val[0]).format("YYYY-MM-DD"),
        end_date: moment(val[1]).format("YYYY-MM-DD"),
      };
      return newTime;
    });
  }
  const newValues = [...values];
  newValues[index] = val;
  setValues(newValues);
};

// 在日期选择器中使用这些函数
<RangePicker
  key={`${i}_range`}
  name={`template_time_${i}`}
  value={values[i]}
  disabledDate={(current) => disabledDate(current, i)}
  onChange={(val) => {
    setValue(i, val);
  }}
  onOpenChange={onOpenChange}
  changeOnBlur
  ref={rangePickerRef}
/>
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容