React — Как правильно получить текущее значение ввода даты?

#javascript #reactjs #datetime

#javascript #reactjs #datetime

Вопрос:

Я пытаюсь сравнить две даты в приложении React, но, похоже, я изо всех сил пытаюсь получить текущее значение ввода даты.

У меня есть два ввода даты, и свойство min второго должно быть>= для первой выбранной даты.

введите описание изображения здесь

Чтобы решить эту проблему, я написал следующий код:

Визуализация:

 <div className='flex-children'>
  <span className='flex-line'>
    <label for='depart'><i class="far fa-calendar-alt"></i> Depart: </label>
    <input type='date' id='depart' value={this.state.depart} min={today} onChange={this.pickDepart} />
  </span>
  <span className='flex-line'>
  <label for='return'> Return: </label>
  <input type='date' id='return' value={this.state.returning} min={minReturn} onChange={this.pickReturn} />
  </span>
</div>
 

Состояние и функции:

 constructor(props) {
        super(props);
        this.state = {
            selectedFrom: '4',
            depart: depart,
            returning: returing
        };

        this.handleChange = this.handleChange.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);

      }

    handleChange(event) {    
        this.setState({
            selectedFrom: event.target.selectedFrom,
            depart: event.target.depart,
            returing: event.target.return
            });
    }

    handleSubmit(event) {
        event.preventDefault();
    }

    pickDepart = (event) => {
        this.setState({depart: event.target.depart});
        setMinDate(event.target.depart);
    };

    pickReturn = (event) => {
        this.setState({returning: event.target.return});
    };
 

И здесь все мои функции даты:

 function addDays(date, days) {
    var result = new Date(date);
    result.setDate(result.getDate()   days);
    return resu<
}
  
function getToday(days){
    var today = new Date();
    var today_us = addDays(today, days)
    var dd = String(today_us.getDate()).padStart(2, '0');
    var mm = String(today_us.getMonth()   1).padStart(2, '0'); //January is 0!
    var yyyy = today_us.getFullYear();
    return yyyy   '-'   mm   '-'   dd;
};

var minReturn = getToday(0);
var depart = getToday(0);
var returing = getToday(21);
const today = getToday(0);


function setMinDate(d1){
    d1 = new Date(d1);
    var d2 = new Date(today);
    console.log(d1);
    console.log(d2);
    if (d1.getTime() >= d2.getTime()){
        minReturn = d1;
    }else{
        minReturn = today;
    }
}
 

Распечатки консоли.журнал здесь:

введите описание изображения здесь

Что я здесь делаю не так и как я могу это исправить?

Ответ №1:

В d1 переменной в setMinDate строке формата это не поддерживается new Date(d1) . Если я не ошибаюсь event.target.depart , у вас формат ‘дд / мм / гггг’, что означает new Date() , что вы не можете преобразовать вашу строку в дату на основе ввода формата даты w3s (ISO, short, long).

Вы не можете преобразовать этот строковый формат даты с помощью этой функции.

 const convertDateStringFormat = (dateString) => {
  // dd/mm/yyyy convert to yyyy-mm-dd
  const _splitedDate = dateString.split("/");
  const convertedDate = `${_splitedDate[2]}-${_splitedDate[1]}-${_splitedDate[0]}`;
  return convertedDate;

}
 

Чтобы предотвратить двусмысленность в одной и той же переменной, избегайте повторения именования переменной

 function setMinDate(d1){
    //d1 = new Date(d1); (You can replace d1 with another name)
    let _d1 = new Date(d1)
    ....
}
 

Комментарии:

1. Это не помогает, поскольку d1 не определен до его преобразования в date 🙁

2. Какое значение во event.target.depart внутренней pickDepart () функции?

3. Зачем переформатировать строку, а затем анализировать ее как UTC? Проще просто преобразовать его в дату: let [d, m, y] = dateString.split(/D/); return new Date(y, m-1, d) . 🙂