【问题标题】:DatePicker date input with custom format具有自定义格式的 DatePicker 日期输入
【发布时间】:2017-07-28 17:06:50
【问题描述】:

我想使用 redux-form 记录我所在州的日期。我使用反应日期选择器。为了使日期选择器与我的 redux-form 兼容,我写道:

import React, { PropTypes } from 'react';
import DatePicker from 'react-datepicker';
import moment from 'moment';
import 'react-datepicker/dist/react-datepicker.css';

    const MyDatePicker = ({ input, meta: { touched, error } }) => (
      <div>
        <DatePicker
          {...input} dateFormat="YYYY-MM-DD"
          selected={input.value ? moment(input.value) : null}
        />
        {
          touched && error &&
          <span className="error">
            {error}
          </span>
        }
      </div>
    );

    MyDatePicker.propTypes = {
      input: PropTypes.shape().isRequired,
      meta: PropTypes.shape().isRequired
    };

    export default MyDatePicker;

问题是,当我选择日期时,我希望它显示为 DD-MM-YYYY,但我希望日期以 YYYY-MM-DD HH:MM:SS 格式保存在我的状态中。这个怎么做?我使用了 moment 的 format 功能,但它似乎不起作用

【问题讨论】:

  • 你的意思是它似乎不起作用?你得到什么错误或得到什么结果?

标签: datepicker format momentjs redux-form


【解决方案1】:

您应该使用redux-form为此提供的the value lifecycle methods

使用parse 格式化来自react-datepicker 的值以进行存储,使用format 将来自存储的值解析回react-datepicker 以呈现它。示例:

function formatDateForInput(storedDate) {
  // the returned value will be available as `input.value`
  return moment(pickedDate).format('right format for your input')
}

function parseDateForStore(pickedDate) {
  // the returned value will be stored in the redux store
  return moment(storedDate).format('desired format for storage')
}

<Field
  component={ MyDatePicker }
  format={ formatDateForInput }
  parse={ parseDateForStore }
/>

如果这对您不起作用,我建议您检查是否需要在redux-form 提供的DatePickerinput 属性之间放置一个自定义onChange 处理程序。因为DatePicker 用来调用onChange 的值可能是redux-form 不理解的值。像这样:

const MyDatePicker = ({ input, meta: { touched, error } }) => {

  const onChange = event => {
    const pickedDate = event.path.to.value;
    input.onChange(pickedDate);
  }

  return (
    <div>
      <DatePicker
        dateFormat="YYYY-MM-DD"
        selected={input.value ? moment(input.value) : null}
        onChange={ onChange }
      />
      {
        touched && error &&
        <span className="error">
          {error}
        </span>
      }
    </div>
  );
}

MyDatePicker.propTypes = {
  input: PropTypes.shape().isRequired,
  meta: PropTypes.shape().isRequired
};

export default MyDatePicker;

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    如果我理解正确,您只需要 2 种不同格式用于 UI 上的相同日期和另一种保存? moment(date).format('DD-MM-YYYY')moment(date).format('YYYY-MM-DD HH:MM:SS') 将为您提供两种格式的日期。

    【讨论】:

      【解决方案3】:

      只需使用道具 dateFormat="dd/MM/yyyy"

      例子:

      <DatePicker 
          selected={startDate} 
          onChange={date => handleChange(date)} 
          dateFormat="DD/MM/YYYY"
      />
      

      【讨论】:

        猜你喜欢
        • 2021-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-30
        • 1970-01-01
        相关资源
        最近更新 更多