如何设置开始日期和结束日期之间的验证应在 3 年内选择

问题描述

我是 React JS 的新手,我如何在 React JS 中实现两个日期字段之间的验证。

例如:结束日期应仅允许在基于开始日期的 3 年内进行选择。

class MyForm extends React.Component {
    constructor(props) {
      super(props);
      this.state = { startdate: '',enddate: '' };
    }
    mySubmitHandler = (event) => {
      event.preventDefault();
      alert("You are submitting " + this.state.startdate +"and"+ this.state.enddate);
    }
    myChangeHandler = (event) => {
      this.setState({startdate: event.target.value});
    }
    myEndDate = (event) => {
        this.setState({enddate: event.target.value});
      }
    render() {
      return (
        <form onSubmit={this.mySubmitHandler}>
        <img src="is.jpg"></img>
        <h2>Please select the Date range of .CSV </h2>
        <input
          type='date'
          onChange={this.myChangeHandler}
        />
        <span>   </span>
       <input
          type="date"
          onChange={this.myEndDate}
        />
        <h6 id="light">Note: Only up to 3 years worth of Data can be downloaded</h6>
        <div>
        {this.state.startdate && this.state.enddate && <input
      type='submit' value="Download" class="bi bi-cloud-arrow-down"  style={{ width: '10%',height: 30}}
    />}
        </div>
        </form>
      );
    }
  }
 
  ReactDOM.render(<MyForm />,document.getElementById('root'));

  export default MyForm;

解决方法

您只需要在 endDate 字段中添加一个 ID 并在开始值的 onChange 期间按照建议更改它的最小值/最大值。

class MyForm extends React.Component {
    [...]
    myChangeHandler = (event) => {
      // used to append 0 in front of the numbers. usage: s(num,length)
      let s = (s,l) => (Array(l).fill('0').join('')+s).substr(-l);
      // get the EndDate node
      let node = this.form.querySelector("#valueEndDate");
      let date = new Date(this.value);
      // set min to current select date - 3 years
      date.setFullYear(date.getFullYear() - 3);
      node.setAttribute("min",[date.getFullYear(),s(date.getMonth()+1,2),s(date.getDate(),2)].join('-'));

      // set max to +3 year ahead of previous time 
      date.setFullYear(date.getFullYear() + 6);
      node.setAttribute("max",2)].join('-'));

      this.setState({startdate: event.target.value});
    }
    render (
       [...] <!-- Added id to get it easily during the change event -->
       <input type="date" id="valueEndDate" onChange={this.myEndDate} />
       [...]
      );
    }
  }
,
if (startDate) {
    var maxDate = startDate;
    maxDate = format(addMonths(startDate,36)," E MMM dd yyyy HH:mm:ss ");
    var strToDate = new Date(maxDate);
    console.log("maxDate value ==" + maxDate);
  }

结束日期将从开始日期增加36个月,然后用户可以在该期间内选择。

然后将字符串转换为日期格式,然后将 strToDate 用于 datepicker 标记。

<DatePicker id="endDate-css" placeholderText={END_DATE} dateFormat='dd-MM-yyyy' selected={endDate} minDate={startDate} maxDate={strToDate} onChange={handleEndDate}/>