美文网首页
封装日期组件

封装日期组件

作者: 金药 | 来源:发表于2023-01-30 16:34 被阅读0次
import React from "react";
import { DatePicker, Input } from "antd";
import styles from "./index.scss";
import moment from "moment";

class MonthPick extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      inputText: "",
      value: "",
    };
  }

  handleOpenChange = (open) => {
    const { value } = this.props;
    if (open) {
      this.setState(
        {
          inputText: value ? moment(value).format("YYYY-MM") : "",
        },
        () => {
          setTimeout(() => {
            document.getElementById("inputBox").focus();
          }, 0);
        }
      );
    }
  };

  // 月份发生变化传值出去
  handleChange = (changedValue) => {
    const { onChange } = this.props;
    let data = changedValue;
    this.setState({ inputText: moment(changedValue).format("YYYY-MM") });
    const dataStr = changedValue ? moment(changedValue).format("YYYY-MM") : "";
    if (onChange) {
      onChange(data, dataStr);
    }
  };

  inputTextChangeFn = (e) => {
    const { disabledDate } = this.props;
    this.setState({
      inputText: e.target.value,
    });
    if (!e.target.value) {
      this.handleChange("");
      this.setState({ inputText: "" });
      return;
    }
    let changedValue = moment(e.target.value);
    // 数据格式是否正确
    if (/^[1-9]\d{3}-(0[1-9]|1[0-2])$/.test(e.target.value)) {
      // 是否有不可选数据
      if (disabledDate) {
        this.isDisabledDateFn(changedValue);
      } else {
        this.handleChange(changedValue);
      }
    }
  };

  isDisabledDateFn = (val) => {
    const { disabledDate } = this.props;
    if (!disabledDate(val)) {
      this.handleChange(val);
    }
  };

  // 处理人员详情页面点击月份组件按钮有时候没有反应的bug
  changeYearFn = (e) => {
    if (e.target.getAttribute("class") == "ant-calendar-month-panel-next-year-btn") {
      e.stopPropagation();
    }
    if (e.target.getAttribute("class") == "ant-calendar-month-panel-prev-year-btn") {
      e.stopPropagation();
    }
    if (e.target.getAttribute("class") == "ant-calendar-year-panel-year") {
      e.stopPropagation();
    }
    if (e.target.getAttribute("class") == "ant-calendar-decade-panel-decade") {
      e.stopPropagation();
    }
    if (e.target.getAttribute("class") == "ant-calendar-picker-clear") {
      e.stopPropagation();
    }
  };

  render() {
    const { inputText } = this.state;
    const { value, placeholder } = this.props;
    return (
      <div className={styles.monthBox} id="monthBox" onClick={(e) => this.changeYearFn(e)}>
        <DatePicker.MonthPicker
          {...this.props}
          dropdownClassName="monthPickBox"
          renderExtraFooter={() => (
            <Input
              id="inputBox"
              style={{ width: "280px", height: "32px", border: "none" }}
              value={inputText}
              onChange={this.inputTextChangeFn}
              placeholder={placeholder ? placeholder : "请选择日期"}
            />
          )}
          // 解决上下滚动月份弹窗没有跟着移动的bug
          // getCalendarContainer={triggerNode => {
          //   console.log(triggerNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode);
          //   if(moreLevel) {
          //     return triggerNode.parentNode
          //   }
          //   return triggerNode.parentNode
          // }}
          format="YYYY-MM"
          onOpenChange={this.handleOpenChange}
          value={value ? moment(value) : undefined}
          onChange={this.handleChange}
        />
      </div>
    );
  }
}

export default MonthPick;

效果


image.png

相关文章

网友评论

      本文标题:封装日期组件

      本文链接:https://www.haomeiwen.com/subject/ojgmhdtx.html