React-Datepicker MomentJS无效日期

时间:2018-11-27 13:45:20

标签: reactjs datepicker momentjs

我正在使用React-Datepicker和MomentJS。但是,当我要使用Moment设置startDate时,该值会在datepickerfield中给出无效的日期。

当我在控制台中记录this.state.startDate时,控制台向我显示以下内容: “开始日期:27-11-2018”,其格式为“ DD-MM-YYYY”。此格式也用于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.log('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"
  },

4 个答案:

答案 0 :(得分:1)

从Hacker0x01开始-“直到1.8.0版之前,该程序包都使用Moment.js。从v2.0.0开始,我们切换到使用本机Date对象以减小程序包的大小。如果您要从1.8切换到此程序。 0到2.0.0或更高版本,请参阅上面的更新示例,以查看示例网站以获取最新示例。”

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

我遇到类似的问题。我将尝试将本机日期转换为react-datepicker完成后的操作。

答案 1 :(得分:0)

@Elvira,使用react-datepicker@2.0.0时遇到了同样的挑战。请务必遵循您使用的任何第三方软件包。 ES6流行的The issue of modules认为moment.js是对反应日期选择器的额外负担,因为moment.js是一个多合一的程序包,即import moment from 'moment';

  

模块的概念使我们能够通过简单地将对象,函数,类或变量导出,然后将其导入其他文件中的需要的位置来使其对外界可用。

react-datepicker@2.0.0moment.js was removed as a dependency开始,团队开始使用本机JavaScript Date对象与date-fns配对,以用于datepicker中的所有日期功能。检查反应日期选择器calendar componentpropTypes,您会发现所有日期都声明为PropTypes.instanceOf(Date)

  

解决方案:坚持使用原生JavaScript Date对象。用户从您的日历中选择一个日期(读为:react-datepicker)之后,您始终可以使用moment.js将该日期对象转换为任何格式。

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}
      />
    );
  }
}

  

下面是我如何处理这种情况:   环境:react @ 16.9.0,react-redux @ 7.1.1,react-datepicker @ 2.0.0,yup @ 0.27.0和Formik@1.5.8(在React中处理表格非常容易)。

// 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);

答案 2 :(得分:-1)

使用startDate: moment().toDate().format('DD-MM-YYYY')返回一个字符串,而DatePicker react组件的选定属性需要一个Date对象。

答案 3 :(得分:-2)

在this.state中代替使用矩 在对我有用的setState中使用它

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



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