redux-form-material-ui 控制的 DatePicker

redux-form-material-ui controlled DatePicker

我不能使用 redux-form-material-ui 中的 DatePicker 作为受控单元。 我打算在开始时生成今天的日期。这是我的代码:

import React from 'react';
import { Field, reduxForm } from 'redux-form';
import { DatePicker } from 'redux-form-material-ui';

class PeriodForm extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
          startDate:new Date(),
        }
    this.handleStartDateChange = this.handleStartDateChange.bind(this);
    }

    handleStartDateChange = (event, date) => {
      this.setState({
        startDate: date
      });
    };

    render(){
    return(
            <div>
                    <form onSubmit={handleSubmit}>
                        <div className="field-line">
                            <Field 
                                name="startDate" 
                                floatingLabelText="Start Date"
                                component={DatePicker} 
                                format={null}
                                value={this.state.startDate}
                                autoOk={true}
                                DateTimeFormat={Intl.DateTimeFormat}
                                onChange={handleStartDateChange}
                            />
                        </div>
                     </form>
                  </div>
)}}
export default reduxForm({
    form: 'PeriodForm', 
})(PeriodForm);

从上面的代码来看,它总是在日期选择器中不显示任何内容,它应该生成今天的日期。 假设我有一个 table 包含日期列表,那么每次我单击日期标签时,它都会为日期选择器生成它的值。如果我对 this.state.startDate 做 "setState" 对吗?

首先,如果您已经在使用 redux-form 进行表单状态管理,则不应使用本地状态来存储表单值,因为 redux-form 已经解决了这一问题。

如果您想为字段提供初始值,可以通过在 mapStateToProps 阶段传递 initialValues 来实现。

此外,您不必在 Field 上显式设置 valueonChange 处理程序,因为导入的包装 DatePicker 组件已经具有里面有逻辑。

以下代码应该有效:

import React from 'react';
import { connect } from 'react-redux';
import { Field, reduxForm } from 'redux-form';
import { DatePicker } from 'redux-form-material-ui';

class PeriodForm extends React.Component {
  render() {
    const { handleSubmit } = this.props;

    return (
      <div>
        <form onSubmit={handleSubmit}>
          <div className="field-line">
            <Field 
              name="startDate" 
              floatingLabelText="Start Date"
              component={DatePicker} 
              format={null}
              autoOk={true}
              DateTimeFormat={Intl.DateTimeFormat}
              />
          </div>
        </form>
      </div>);
  }
}

const Form = reduxForm({
  form: 'PeriodForm',
  enableReinitialize: true
})(PeriodForm);

export default connect(() => ({
  initialValues: {
    startDate: new Date()
  }
}))(Form);
import DatePicker from 'material-ui/DatePicker';
import React from 'react';

const DatePickerExampleInline = () => (
  <div>
   <DatePicker hintText="Portrait Inline Dialog" container="inline" />
   <DatePicker hintText="Landscape Inline Dialog" container="inline" mode="landscape" />
  </div>
);
export default DatePickerExampleInline;

You can user "material-ui", Above is working example. Hope it will help you.

我已经解决了我的问题。我重构 DatePicker 组件如下:

MUIDatePicker.js

import React from 'react';
import { DatePicker } from 'redux-form-material-ui'

const MUIDatePicker = props => (
  <DatePicker 
    {...props}
    value={props.val}
  />
)

export default MUIDatePicker;

然后我打电话给 Field 中的组件道具:

<Field 
    name="startDate" 
    floatingLabelText="Start Date"
    component={MUIDatePicker}
    format={null}
    val={this.state.startDate}
    autoOk={true}
    onChange={handleStartDateChange}
    DateTimeFormat={Intl.DateTimeFormat}
 />

似乎如果我在组件道具中直接传递 DatePicker,它不会设置值。