我正在使用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"
},
答案 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.0
,moment.js was removed as a dependency开始,团队开始使用本机JavaScript Date对象与date-fns配对,以用于datepicker中的所有日期功能。检查反应日期选择器calendar component的propTypes
,您会发现所有日期都声明为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')
});
};