2016-08-03 69 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" /> 

以上是工作,所以也許你可以嘗試從那裏迭代,直到問題重現添加代碼?在底部