2016-08-03 70 views
0

我最近升级到redux-form v6,并且我的material-ui自定义日期时间选择器停止工作。下面是它看起来像现在:DateTimePicker Redux窗体字段问题

class DateTimePicker extends React.Component { 
    handleDateChanged(e, value) { 
    let currentTime; 
    if (this.props.dateField.value) { 
     let currentValue = moment(this.props.dateField.value); 
     currentTime = currentValue.subtract(currentValue.clone().startOf('day')); 
    } 
    let newValue = moment(value).startOf('day').add(currentTime || 0); 
    this.props.dateField.onChange(newValue.toDate()); //this.refs.timePicker goes undefined when this line runs. 
    this.refs.timePicker.openDialog(); 
    } 
    handleTimeChanged(e, value) { 
    return this.props.dateField.onChange(value); //This is called, but the value does not change. 
    } 
    formatDate(value) { 
    return moment.tz(value, this.props.timezone).format('M/D/YY HH:mm zz'); 
    } 
    render() { 
    return (
     <span> 
     <DatePicker 
      value={this.props.dateField.value || null} 
      autoOk={true} 
      maxDate={new Date()} 
      floatingLabelText="Change At" 
      floatingLabelStyle={{pointerEvents: 'none'}} 
      errorText={this.props.dateField.touched && this.props.dateField.error} 
      formatDate={this.formatDate.bind(this)} 
      onChange={this.handleDateChanged.bind(this)} 
     /> 
     <TimePicker 
      style={{display: 'none'}} 
      value={this.props.dateField.value || null} 
      format="24hr" 
      hintText="Time" 
      ref="timePicker" 
      onChange={this.handleTimeChanged.bind(this)} 
     /> 
     </span> 
    ); 
    } 
} 

而且它的形式使用,像这样:

<Field 
    name="changeAt" 
    component={({input}) => { 
    return <DateTimePicker dateField={input} timezone={this.props.driver.homeTerminal.timezone} /> 
    }} 
/> 
我有两个不同的问题

第一个问题:当我选择一天时,handleDateChanged被称为预期。当方法开始时,this.refs.timePicker按预期引用时间选择器。但是,执行上面的行时(this.props.dateField.onChange(newValue.toDate())),则引用将丢失,并且this.refs.timePicker将更改为undefined

每个后续时间我选择一个日期,refs不会丢失,并且它可以正常工作。

第二个问题:当我选择一个时间时,handleTimeChanged被调用,其中调用this.props.dateField.onChange(value)具有正确的值;但是价值没有改变。

任何建议表示赞赏。

回答

2

我是新来的这个东西,所以我不知道我是否会用得太多。但解决第二个问题:我的代码和你的唯一区别是我在做<DatePicker ... onChange={this.props.onChange} />。或者你可以做

constructor(){this.handleChange = this.handleChange.bind(this)} 

然后删除render()方法中的绑定。每当(道具?)发生变化时,渲染方法都会被调用,并且问题可能与此绑定有关。

这个文档:http://redux-form.com/6.0.0-rc.4/docs/faq/CustomComponent.md/

我还使用一个反应元素,而不是使用一个组成部分,它出来相当干净。

const DateInput = ({ input, label, meta: { touched, error } }) => (
<DateTimeField onChange={input.onChange} /> 
); 

<Field name="date" component={DateInput} label="Date & Time Starting" /> 

以上是工作,所以也许你可以尝试从那里迭代,直到问题重现添加代码?在底部