React-Datepicker MomentJS Неверная дата

Я использую React-Datepicker и MomentJS. Но когда я хочу использовать Moment для установки startDate, значение дает Invalid date в поле datepickerfield.

Когда я регистрирую this.state.startDate в консоли, консоль показывает мне следующее: «дата начала: 27-11-2018», имеет формат «ДД-ММ-ГГГГ». Этот формат также используется для компонента DatePicker.

import * as React from "react";
import * as ReactDOM from "react-dom";

import DatePicker from "react-datepicker";
import "react-datepicker/dist/react-datepicker.css";
import * as moment from "moment";
import "moment/locale/nl";

export class DateContainer extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      startDate: moment().format('DD-MM-YYYY'),
    };
  }
  render() {
    console.info('startdate:',this.state.startDate);
    return (
        <div className = "date-Filter">
          <div className = "date-Filter-Title">Release Date</div>
          <DatePicker
            onChange = {this.handleStartDate}
            selected = {this.state.startDate}
            dateFormat = "DD-MM-YYYY"
            isClearable = {true}
            placeholderText = "Select a date other than today or yesterday"
            fixedHeight = {true}
            tetherConstraints = { [] }
            locale = "nl"
            popperPlacement = "right-start"
            popperModifiers = {{
             flip: {
               enabled: false
             },
             preventOverflow: {
               enabled: true,
               escapeWithReference: false
             }
           }}
           selectsStart
           startDate = {this.state.startDate}
           className = "startDate"
           showMonthDropdown
           showYearDropdown
          />
        </div>
    );
  }
}

Может ли кто-нибудь объяснить мне, почему в браузере отображается недопустимая дата.

Мои зависимости:

  "dependencies": {
    "moment": "^2.22.2",
    "react": "^16.6.0",
    "react-datepicker": "^2.0.0",
    "react-dom": "^16.6.0",
    "sass-loader": "^7.1.0",
    "searchkit": "^2.3.1-alpha.4"
  },
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
7
0
18 068
4

Ответы 4

Используйте startDate: moment().toDate().

.format('DD-MM-YYYY') возвращает нить, в то время как для выбранной опоры компонента реакции DatePicker требуется объект Дата.

Вместо использования момента в this.state используйте его в setState .. это сработало для меня

constructor(props) {
    super(props);
    this.state = {
      startDate: new Date(),
   }



handleDateChange = date => {
    this.setState({
      startDate: moment(date).format('DD-MM-YYYY')
    });
  };

Привет, объясните, пожалуйста, свой код, почему это ответ и в чем проблема.

ChrisR 23.01.2019 17:31

Я только что отредактировал код, используя моменты в this.state, дата отображается как недействительная.

Alfred Bryan 23.01.2019 18:19

Из Hacker0x01 - «До версии 1.8.0 в этом пакете использовался Moment.js. Начиная с версии 2.0.0, мы перешли на использование собственных объектов Date, чтобы уменьшить размер пакета. Если вы переключаетесь с 1.8.0 на 2.0 .0 или выше, пожалуйста, просмотрите обновленный пример выше или посетите сайт примеров, чтобы увидеть самые свежие примеры ".

https://github.com/Hacker0x01/react-datepicker

У меня похожая проблема. Я собираюсь попробовать превратить родную Date в момент после того, как response-datepicker сделал это.

Я справился с этим, установив дату начала на момент, а затем превратил ее в родную дату, которую может понять response-datepicker. this.state = { startDate: moment().todate, }; Затем я мгновенно завернул результат обработчика событий. startDate = {moment(this.state.startDate)} надеюсь, что это поможет

Lance Crowder 18.04.2019 18:03

@Elvira, я столкнулся с той же проблемой при использовании [email protected]. Очень важно следить за любыми сторонними пакетами, которые вы используете. Проблема модулей, популяризированный ES6, считал moment.js дополнительным багажом в react-datepicker, поскольку moment.js - это универсальный пакет, то есть import moment from 'moment';.

The concept of modules enables us to make objects, functions, classes or variables available to the outside world by simply exporting them and then importing them where needed in other files.

Начиная с [email protected], moment.js был удален как зависимость и команда начали использовать собственный объект Date javascript в сочетании с date-fns для всех функций даты в datepicker. Осмотрите propTypes в response-datepicker компонент календаря, и вы заметите, что все даты объявлены как PropTypes.instanceOf(Date).

Solution: Stick to using the native JavaScript Date object. After a user selects a date from your calendar (read: react-datepicker), you can always convert that date object using moment.js to whatever format.

export class DateContainer extends React.Component {
  constructor(props) {
    super(props);
    // Used 'started' to avoid name conflicts, and return date object
    this.state = { started: new Date(), };
  }
  render() {
    const { started } = this.state
    return (
      // other jsx...
      <DatePicker
        // other props...
        selected = {started}
        startDate = {started}
      />
    );
  }
}

Below is how i went about dealing with this situation: Environment: [email protected], [email protected], [email protected], [email protected] and [email protected] (handling forms in react, made easy).

// stateless component
const InputForm = ({
  // other destructered props...
  dispatch = f => f
}) => {
  const values = {
    // initial state
  }

  return (
    <Formik
      // other props...
      onSubmit = {
        async (values) => {
          // Here is my solution...
          // convert date object from react-datepicker using moment.js,
          // before i dispatch my state object.
          const userData = {
            ...values,
            start_date: moment(values.start_date).format('YYYY-MM-DD')
          }
          await dispatch(someAction(userData));
          // ...
        }
      }
    />
  )
};

export default connect()(InputForm);

Используете date-fns? Сделайте это import { format } from 'date-fns и назначьте start-date: format(values.join_date, 'yyyy-MM-dd'). Работает отлично.

MwamiTovi 09.11.2019 13:34

Другие вопросы по теме