首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >React-Datepicker MomentJS无效日期

React-Datepicker MomentJS无效日期
EN

Stack Overflow用户
提问于 2018-11-27 21:45:20
回答 4查看 18K关注 0票数 7

我使用的是React-Datepicker和MomentJS。但是当我想使用Moment来设置startDate时,这个值在日期选择器字段中给出了无效的日期。

当我在控制台中登录this.state.startDate时,控制台会显示以下信息:"startdate: 27-11-2018",格式为'DD-MM-YYYY‘。此格式也用于DatePicker组件。

代码语言:javascript
复制
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>
    );
  }
}

有人能给我解释一下为什么浏览器里显示的是无效日期吗?

我的依赖关系:

代码语言:javascript
复制
  "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"
  },
EN

回答 4

Stack Overflow用户

发布于 2018-12-11 20:32:46

使用startDate: moment().toDate()

.format('DD-MM-YYYY')返回字符串,而DatePicker react组件的选定属性需要Date对象。

票数 7
EN

Stack Overflow用户

发布于 2019-04-18 00:48:57

从Hacker0x01 -“直到1.8.0版本,这个包一直使用Moment.js。从v2.0.0开始,我们切换到使用原生Date对象来减小包的大小。如果你要从1.8.0切换到2.0.0或更高版本,请查看上面的更新示例,请查看示例网站以获取最新的示例。”

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

我也有类似的问题。我将尝试将原生日期转换为react-datepicker完成其工作后的某个时刻。

票数 3
EN

Stack Overflow用户

发布于 2019-10-06 05:04:10

@Elvira,我在使用react-datepicker@2.0.0时遇到了同样的挑战。遵循你所使用的任何第三方包是至关重要的。由ES6推广的The issue of modules认为moment.js是react-datepicker中的额外负担,因为moment.js是一个一体化的软件包,即import moment from 'moment';

模块的概念使我们能够通过简单地导出对象、函数、类或变量,然后在其他文件中需要的地方导入它们,从而使它们对外部世界可用。

react-datepicker@2.0.0开始,moment.js was removed as a dependency和团队开始使用原生javascript Date对象与date-fns配对,以实现datepicker中的所有date功能。检查react-datepicker calendar componentpropTypes,您将注意到所有日期都被声明为PropTypes.instanceOf(Date)

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

代码语言:javascript
复制
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}
      />
    );
  }
}

下面是我如何处理这种情况的:Environment: react@16.9.0,react-redux@7.1.1,react -

@2.0.0,yup@0.27.0和Formik@1.5.8 (在react中处理表单,变得容易)。

代码语言:javascript
复制
// 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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53501134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档