【问题标题】:redux-form-material-ui controlled DatePickerredux-form-material-ui 控制的 DatePicker
【发布时间】:2017-04-13 04:34:16
【问题描述】:

我不能在 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);

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

【问题讨论】:

    标签: reactjs material-ui redux-form


    【解决方案1】:

    首先,如果您已经在使用 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);
    

    【讨论】:

    • 如果我想更改 datepicker 的值,假设我有一个包含日期列表的表,并且每次单击表中的日期时,我都会生成 datepicker 的值。我该怎么办?
    • 我认为实现这一目标的最简单方法是将所有内容分成多个组件。一个组件将包含带有日期的表格,它定义了一个onChange 处理程序,每当您的日期更改时就会触发该处理程序。您的 PeriodForm 现在也将接受外部日期属性值;在表格组件中选择的那个。最后将它们拼凑在一起的是一个容器组件,它将选定的日期传递到表单组件中。然后,您可以再次使用 mapStateToProps 将 initialValues 设置为外部日期值。
    • 我已经这样做了,我将包含表中选定日期的道具作为值道具传递给 PeriodForm 中的日期选择器。我得到的问题是,道具被改变了,但它没有在日期选择器中填充任何日期,它仍然是空白的。 @丹尼斯
    • 也许您还需要将enableReinitialize: true 传递给您的reduxForm() 配置。这将使表单在每次initialValues 的值发生变化时重新初始化。
    • 语法是什么样的? @丹尼斯
    【解决方案2】:

    我已经解决了我的问题。我将 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,它似乎不会设置值。

    【讨论】:

    • 虽然这可能有效,但我认为通常不鼓励对数据使用两种真实来源,因为这可能会导致不可预测的行为。
    • 我想是的,您还有其他想法可以解决这个问题吗? @丹尼斯
    【解决方案3】:
    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;
    

    您可以使用“material-ui”,上面是工作示例。希望对你有帮助。

    【讨论】:

    • 我想将我的 redux 表单与 material-ui 集成。不只是使用 material-ui 组件。 @umishra
    • Please check link希望对你有帮助
    猜你喜欢
    • 2018-10-21
    • 2018-09-14
    • 2020-11-03
    • 2019-06-06
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多