当前位置: 首页 > 知识库问答 >
问题:

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

臧欣怿
2023-06-03

功能需求就是时间跨度最大为一个月 并且当天以后的禁用 就这个时间跨度最大一个月 试了好多种办法都行 有没有大佬帮我看看代码哪里出了问题 都贴上来了
react版本 17.0.2
image.png

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个答案

葛威
2023-06-03

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}
/>
 类似资料:
  • 问题内容: 我正在尝试使用JQuery Ui禁用特定日期。但是,我没有运气,这是我的代码: 实例化datepicker对象 获取日历中要禁用的日期 它似乎没有用,我知道如何解决这个问题。干杯。 问题答案: 好像您在一个输入上调用了两次。很难遵循您的代码,但是如果您重新组织代码并删除第二个调用,那么一切都会正常进行:

  • 我使用npm包在我的React应用程序中使用Bootstrap 4组件。 然后尝试在我的组件中使用它: 我得到了错误 在C:\Users\y\Desktop\Code\test\node\u modules\react bootstrap date picker\lib中找不到模块:“react bootstrap/lib/Button” @./~/react-bootstrap-date-pic

  • 问题内容: 我想在的日期选择器中禁用特定的日期。 我正在使用CSS作为组件。 我要禁用的日期将根据组合中先前值的选择而动态更改。 我相信应该可以,尽管不确定。 我怎样才能做到这一点 ? 问题答案: 我假设您正在使用Angular-UI中的指令。该属性使您可以禁用某些日期(例如,周末)。看到这个笨蛋http://plnkr.co/edit/gGAU0L?p=preview 如果要基于选择动态禁用日期

  • 我想禁用日期时间选择器中的时间选择器。我正在使用一些参数,如picTime: false和form:"dd MM yyyy"。但是没有用...我正在使用http://eonasdan.github.io/bootstrap-datetimepicker/ Plzz给出解决方案

  • 我的脚本如下: 我的html输入字段如下所示: 当我单击图像时,我正在获取输入字段的ui日历,请帮助我禁用日历中以前的日期,以便用户只能从今天开始选择开始日期。非常感谢。

  • 问题内容: 日期选择器降落在Chrome 20上,是否有任何属性可以将其禁用?我的整个系统使用jQuery UI datepicker及其跨浏览器,因此,我想禁用Chrome本机datepicker。有标签属性吗? 问题答案: 隐藏箭头: 并隐藏提示: